怎样在前端Javascript中调⽤C#⽅法(1)简单实现(附源码)
  相信不少朋友在刚接触WebForm编程的时候都有过这样的想法,为什么在.aspx页⾯的Javascript中不能直接调⽤到.aspx.cs⽂件中的⽅法?这篇⽂章所介绍的内容与这个问题有点关系,但并没有真正的解决Javascript直接调⽤C#的⽅法这个问题,只是通过其它的⽅式让我们前端与后端的交互实现起来能更简单些,介绍的内容是本⼈在实际的开发过程中累积的⼀点点⼼得,分享出来,不对的地⽅或有更好的实现,⼤家不妨拿出来⼀起交流。
  Ajax这个东西就不⽤我过多的介绍了,相信⼤家可能⽐我了解的还要多,当有⼀些静态(或伪静态)页⾯中有部分数据需要动态更新
时,Ajax就⽤得⽐较多了,处理Ajax请求的⽅法也有很多种,有的朋友直接新建⼀个.aspx页⾯,然后在.aspx.cs⽂件中Response.Write,有的朋友则喜欢⽤.ashx⽂件来处理,也有的朋友喜欢⽤IHttpHandler。⽂章中使⽤的就是IHttpHandler。
  ⼀般需要动态输出的内容或多或少会跟业务逻辑有些关联,所以在⽰例中代码是分了两个项⽬,Web项⽬只负责数据的展⽰,Biz项⽬负责逻辑的处理。演⽰的代码仅作为简单⽰例,实际开发项⽬中的代码可能会有很⼤的差异。
  下⾯进⼊正题,说说我们要实现的内容。
  在html页⾯中我们可以通过指定规则的链接直接访问到Biz项⽬中的某个类的指定⽅法。
  如请求/Ajax/News/GetNewsHits.aspx,则我们可以调⽤到Biz项⽬中的News类⾥的GetNewsHits⽅法。
  既然⼤家都知道直接调⽤是不可能实现的了,那我们肯定需要⼀个代理来帮我们完成中间的过程。
  ⾸先,我们先在Web项⽬的根⽬录下建⽴⼀个Ajax⽂件夹,并在⾥⾯添加⼀个fig⽂件。代码如下:
View Code
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<httpHandlers>
<add path="*.aspx" validate="false" type="Biz.Factory" verb="*"/>
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="AjaxRequestFactory" path="*.aspx" type="Biz.Factory" verb="*"/>
</handlers>
</system.webServer>
</configuration>
  这段代码表⽰Ajax⽂件夹下所有的aspx⽂件请求都交给“Biz.Factory”类来处理。
  然后我们在Biz项⽬中加⼊类“Factory”,也就是我们的代理类,由它来负责将请求转接到指定的⽅法,并实现IHttpHandler接⼝。代码如下:
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace Biz {
public class Factory : IHttpHandler {
public bool IsReusable {
get {
return true;
}
}
public void ProcessRequest(HttpContext context) {
Execute(context);
}
void Execute(HttpContext context) {
//根据请求的Url,通过反射取得处理该请求的类
string url = context.Request.Url.AbsolutePath;
string[] array = url.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
string typename = "Biz";
for (int x = 1; x < array.Length - 1; x++) {
typename += "." + array[x];
}
Type type = this.GetType().Assembly.GetType(typename, false, true);
if (type != null) {
//取得类的⽆参数构造函数
var constructor = type.GetConstructor(new Type[0]);
//调⽤构造函数取得类的实例
var obj = constructor.Invoke(null);
//查请求的⽅法
var method = type.GetMethod(System.IO.Path.GetFileNameWithoutExtension(url));
if (method != null) {
//执⾏⽅法并输出响应结果
context.Response.Write(method.Invoke(obj, null));
}
}
}
}
}
  当然,我们还需要⼀个⽤来做演⽰的被调⽤的类News:
View Code
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5
6namespace Biz {
7public class News {
8static int _value;
9public int GetNewsHits() {
10return ++_value;
11        }
12    }
13 }
最后回到web项⽬中新建⼀个html⽂件,代码很简单,ajax就不重复敲代码了,直接⽤jquery⾥相关的⽅法:View Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="/1999/xhtml">
<head runat="server">
<title></title>
<script language="javascript" type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script>
<script language="javascript" type="text/javascript">
$(function () {
//绑定按钮点击事件
$("input:button").click(function () {
$.post("/Ajax/News/GetNewsHits.aspx", null, function (txt) {
$("div").text(txt);
}, "text");
});
});
</script>
</head>
<body>
<div >0</div>
<input type="button" value="获取点击次数"/>
</body>
</html>
所有代码准备完成,实际上代码没⼏⾏,Biz项⽬中的类及⽅法可以随意添加,只需要更改调⽤的链接即可。
附⽰例代码下载:
⽰例代码说明:
1.需要运⾏项⽬才能看到演⽰效果。
2.每点击⼀次按钮服务端的变量就回累加1并返回。
3.您也可以在Biz.News类中加⼊另⼀个⽅法进⾏测试,当然调⽤链接中的GetNewsHits要修改成您对应的⽅法名。javascript属于前端吗
4.您也可以在Biz项⽬中加⼊⼀个新的类来测试,条件是新的类必须有⽆参数构造函数。
未完待续...

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。