ASP.NET WebForm也可以这样用Ajax
作者:网络转载 发布时间:[ 2013/4/2 9:53:36 ] 推荐标签:
如果方法中出现非以上类型,将会抛出异常。为了方便Ajax的调试,在JS前段类库中我会对异常进行处理,并抛出Error,Error信息有效的截取了继承自Exception的抛出信息,至于如何获得更加详细的JS调试信息,以后JS库中可能会做提供更加详细的调用信息,毕竟框架是在改进中进行的。如下是AjaxApplication类的具体代码:
public class AjaxApplication
{
private AjaxBasePage m_AjaxBasePage;
private object m_ResponseData;
public AjaxApplication(AjaxBasePage ajaxBasePage, AjaxRequest ajaxRequest)
{
this.m_AjaxBasePage = ajaxBasePage;
Type ajaxBasePageType = ajaxBasePage.GetType();
MethodInfo methodInfo = ajaxBasePageType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)
.FirstOrDefault(item => item.Name == ajaxRequest.MethodName);
object[] parameterData = this.GetParameterData(ajaxRequest, methodInfo);
if (methodInfo.IsStatic)
{
this.m_ResponseData = methodInfo.Invoke(null, parameterData);
}
else
{
this.m_ResponseData = methodInfo.Invoke(ajaxBasePage, parameterData);
}
}
/// <summary>
/// 获取参数数据。
/// </summary>
private object[] GetParameterData(AjaxRequest ajaxRequest, MethodInfo methodInfo)
{
if (methodInfo != null)
{
ParameterInfo[] parameterInfos = methodInfo.GetParameters();
if (parameterInfos.Length > 5)
{
throw new NotSupportedException("多支持5个参数");
}
if (parameterInfos.Length > ajaxRequest.Parameters.Count)
{
throw new ArgumentException("缺少参数!");
}
List<object> parameterData = new List<object>(parameterInfos.Length);
for (int i = 0; i < parameterInfos.Length; i++)
{
ParameterInfo parameterInfo = parameterInfos[i];
string paramValue = ajaxRequest.Parameters[i];
try
{
parameterData.Add(ParseAjaxParameter(paramValue, parameterInfo));
}
catch (FormatException)
{
string format = string.Format("传入静态方法 {0} 的第 {1} 个(从0开始计数)参数类型不匹配,应该为 {2} 类型 请检查!", methodInfo.Name, i, parameterInfo.ParameterType.Name);
throw new FormatException(format);
}
}
return parameterData.ToArray();
}
else
{
throw new InvalidOperationException("没有发现此方法,请检查该方法签名(方法必须为public)");
}
}
/// <summary>
/// 类型转换。支持 String、Boolean、Int32、Int64、UInt32、UInt64、Single、Double、Decimal、DateTime、DateTimeOffset、TimeSpan、Guid
/// </summary>
private object ParseAjaxParameter(string ajaxParameterValue, ParameterInfo parameterInfo)
{
object obj;
if (parameterInfo.ParameterType == typeof(String))
{
obj = ajaxParameterValue;
}
else if (parameterInfo.ParameterType == typeof(Boolean))
{
obj = bool.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(Int32))
{
obj = Int32.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(UInt32))
{
obj = UInt32.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(UInt64))
{
obj = UInt64.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(Single))
{
obj = Single.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(Double))
{
obj = Double.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(Decimal))
{
obj = Decimal.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(DateTime))
{
obj = DateTime.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(DateTimeOffset))
{
obj = DateTimeOffset.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(TimeSpan))
{
obj = TimeSpan.Parse(ajaxParameterValue);
}
else if (parameterInfo.ParameterType == typeof(Guid))
{
obj = Guid.Parse(ajaxParameterValue);
}
else
{
throw new NotSupportedException("方法参数类型不支持!");
}
return obj;
}
/// <summary>
/// 结束页面生命周期,同时直接执行应用程序生命周期的EndRequest事件。
/// </summary>
public void EndRequest()
{
HttpResponse response = this.m_AjaxBasePage.Page.Response;
response.ContentType = "application/json";
response.Clear();
JavaScriptSerializer jsonSerializer2 = new JavaScriptSerializer();
response.Write(jsonSerializer2.Serialize(new JsonResponse { IsSuccess = true, Message = "处理成功", ResponseData = this.m_ResponseData }));
response.End();
}
}
当初始化了一个AjaxApplication实例后,可以调用该实例的EndRequest()方法,来结束Ajax请求。该方法内部后调用Response.End()方法来结束页面生命周期和大部分管线事件。
并用JsonResponse类来封装返回数据。
public class JsonResponse
{
public bool IsSuccess { get; set; }
public string Message { get; set; }
public object ResponseData { get; set; }
}
该类后一个参数即承载了调用方法的返回值,为一个Object类型,也是说,框架可以支持任何类型的返回值,当然该类型可以被序列化。
7、回过头来再看Ajax请求,针对返回值可以这样用:
PowerAjax.AsyncAjax('TestAjaxMethod', [1, 2, "333", "sss"], function (SucceessResponse) {
if (SucceessResponse.IsSuceess) {
alert("恭喜,该ajax方法调用成功!");
Process(SucceessResponse.ResponseData); // 处理返回的数据,这里可能需要你自己实现了,因为我无法判断你要返回的是什么东西,这是个Object
} else {
alert("这是操作错误奥,不是内部异常,内部异常的抛出会我内部会处理的!");
alert("错误信息:" + SucceessResponse.Message);
}
});
以上是试水的东西,希望各位大牛指正。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11