建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 网站开发 > asp.net教程 >

ASP.NET中基于Ajax的AjaxHandler

时间:2010-05-11 23:10来源: 作者: 点击:
以前在使用Jquery的Ajax的时候,总是要新建一个ashx或者aspx来处理程序,当大量使用ajax的时候,发现建了一大堆的处理页面,刚觉很是不爽后来我想,用反射的方式直接去掉cs里的方法不是很好,很爽,这就是初衷。

以前在使用Jquery的Ajax的时候,总是要新建一个ashx或者aspx来处理程序,当大量使用ajax的时候,发现建了一大堆的处理页面,刚觉很是不爽

后来我想,用反射的方式直接去掉cs里的方法不是很好,很爽,这就是初衷。

1,先写个处理程序

public class Handler : IHttpHandler, IRequiresSessionState

 

2,核心代码

string method = Request["METHAD"];//namespace.class.method//包名.类名.方法名
string ClassNamespace = method.Substring(0, method.LastIndexOf("."));// "</SPAN>< style="FONT-FAMILY: 宋体; COLOR: green; FONT-SIZE: 9pt" SPAN >?;< SPAN>
object objType = CreateObjectNoCache(Request["DLL"], ClassNamespace);//反射
Type ht = objType.GetType();
List
<string> likey = new List<string>();
foreach (string item in Request.Params.AllKeys)
{
if (item.StartsWith("[__DOTNET__]"))
likey.Add(item);
}
int length = likey.Count;//Request.Form.AllKeys.Length;
//int length=Request
//反射方法参数,和类型
object[] obj = new object[length];// 数据
Type[] objTypes = new Type[length];//类型

for (int i = 0; i < length; i++)
{
string ReqKey = likey[i].Substring(12);//Request.Form.AllKeys[i];
Type tType = null;
if (ReqKey.IndexOf("[") != -1)
{
tType
= Type.GetType(ReqKey.Remove(ReqKey.LastIndexOf("[")), true, true);
}
else
{
tType
= Type.GetType(ReqKey, true, true);
}
objTypes[i]
= tType;//类型赋值
//如果它是值类型,或者String
if (tType.Equals(typeof(string)) || tType.Equals(typeof(string[])) || (!tType.IsInterface && !tType.IsClass))
{
obj[i]
= Convert.ChangeType(Request.Params[likey[i]], tType);
}
else if (tType.IsClass)//如果是类,将它的json字符串转换成对象
{
obj[i]
= JavaScriptConvert.DeserializeObject(Request.Params[likey[i]], tType); //Serialize.Deserialize(Request.Form[i], tType);
}
}
//TODO
MethodInfo methodInfo = ht.GetMethod(method.Substring(method.LastIndexOf(".") + 1), objTypes);
object returnValue = null;
foreach (object attribute in methodInfo.GetCustomAttributes(true))
{
if (attribute is AjaxMethod)
{
returnValue
= methodInfo.Invoke(objType, obj);
break;
}
}
//执行方法
//object returnValue = methodInfo.Invoke(objType, obj);
if (returnValue == null)
throw new Exception("你没用权限执行该方法,是否加了[XAjaxMethod]自定义属性");

3,返回值处理,类会直接被序列化成json格式

#region 处理返回值
if (returnValue.GetType().IsClass && !returnValue.GetType().Equals(typeof(string)))
{
if (returnValue.GetType().Equals(typeof(XmlDocument)))
{
//如果是XML文档,则写入xml文档
Response.ContentType = "text/xml";
Response.Write(((XmlDocument)returnValue).OuterXml);
}
else if (returnValue.GetType().IsClass && returnValue.GetType().Equals(typeof(DataTable)))
{
if (!string.IsNullOrEmpty(Request["callback"]) && Request["callback"].StartsWith("jsonp"))
{
Response.ContentType
= "application/json";
Response.ContentEncoding
= Encoding.Default;
Response.Write(Request[
"callback"] + "(" + Json.DataTableToJson("Rows", (DataTable)returnValue) + ")");
}
else
Response.Write(Json.DataTableToJson(
"Rows", (DataTable)returnValue));
}
else
{
if (!string.IsNullOrEmpty(Request["callback"]) && Request["callback"].StartsWith("jsonp"))
{
Response.ContentType
= "application/json";
Response.ContentEncoding
= Encoding.Default;
Response.Write(Request[
"callback"] + "(" + JavaScriptConvert.SerializeObject(returnValue) + ")");
}
else
Response.Write(JavaScriptConvert.SerializeObject(returnValue));
}
}
else
{
if (!string.IsNullOrEmpty(Request["callback"]) && Request["callback"].StartsWith("jsonp"))
{
Response.ContentType
= "application/json";
Response.ContentEncoding
= Encoding.Default;
Response.Write(Request[
"callback"] + "(\"" + returnValue.ToString() + "\")");
}
else
Response.Write(returnValue.ToString());
}
#endregion

 

4,为了防止跨权限调用了其他的方法加了个自定义属性

public class AjaxMethod : Attribute
{
public override string ToString()
{
return "XAjaxMethod";
}
}

 

5,webconfig配置

<httpHandlers>
<add path="DotNet2.ashx" verb="*" type="AjaxHandler.Handler,AjaxHandler"/>
</httpHandlers>

 

 

6,jquery调用

$.ajax({
url:
"/DotNet2.ashx?METHAD=AjaxTest._Default.Test&DLL=AjaxTest",
data: {
"[__DOTNET__]System.String": "测试测试一"
},
success:
function(json) {
alert(json);
}
});

7,url格式

METHAD:命名空间.类名.方法名
DLL:DLL名称

8,ajax参数

data: {
"[__DOTNET__]System.String": "测试测试二",
"[__DOTNET__]System.Int32": "12345678"
}
需要加上[__DOTNET__]前缀,后面是参数类型,前缀是为了处理get方式

9,下载源代码

(责任编辑:admin)
织梦二维码生成器
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片