1.触发ajax方法
2.触发js函数Ajax_CallBack异步请求当前url,并带把控件id和方法参数等通过form post。
x.open("POST", url, clientCallBack ? true : false);
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
var encodedData = "Ajax_CallBackType=" + type;
encodedData += "&Ajax_CallBackMethod=" + method;
if (args) {
for (var i in args) {
encodedData += "&Ajax_CallBackArgument" + i + "=" + encodeURIComponent(args[i]);
}
}
x.send(encodedData);
3.进入了后台,页面的onload又从新向AjaxManager注册
AjaxManager.Register(this,"CategoryForm");
-->向控件的PreRender 事件注册回调
control.Page.RegisterClientScriptBlock("AjaxManager:" + prefix, controlScript.ToString());
control.PreRender += new EventHandler(OnPreRender);
4. AjaxManager回调触发
根据HttpContext.Current.Request.Form["Ajax_CallBackType"];是否为空来判断是否AJAX方法触发的回调。
搜寻根据Post的信息寻找方法,找到后调用并调用 resp.End()在页面的其他数据返回前立即结束。
AJAX.NET中异步回调只允许WebService方式?
客户端js由ScriptManager实例注册回调page.PreRenderComplete += OnPagePreRenderComplete;
并在该函数中生成,返回客户页面上
针对那些定义WebMethod进行注册
以IHttpHandle来处理异步的回调
2.触发js函数Ajax_CallBack异步请求当前url,并带把控件id和方法参数等通过form post。
x.open("POST", url, clientCallBack ? true : false);
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
var encodedData = "Ajax_CallBackType=" + type;
encodedData += "&Ajax_CallBackMethod=" + method;
if (args) {
for (var i in args) {
encodedData += "&Ajax_CallBackArgument" + i + "=" + encodeURIComponent(args[i]);
}
}
x.send(encodedData);
3.进入了后台,页面的onload又从新向AjaxManager注册
AjaxManager.Register(this,"CategoryForm");
-->向控件的PreRender 事件注册回调
control.Page.RegisterClientScriptBlock("AjaxManager:" + prefix, controlScript.ToString());
control.PreRender += new EventHandler(OnPreRender);
4. AjaxManager回调触发
根据HttpContext.Current.Request.Form["Ajax_CallBackType"];是否为空来判断是否AJAX方法触发的回调。
搜寻根据Post的信息寻找方法,找到后调用并调用 resp.End()在页面的其他数据返回前立即结束。
{
Control control = s as Control;
MethodInfo methodInfo = null;
if (control != null)
{
if (control.GetType().FullName == CallBackType || control is Page)
{
if (control is Page || control.ClientID == CallBackID)
{
methodInfo = FindTargetMethod(control);
}
}
}
object val = null;
string error = null;
HttpResponse resp = HttpContext.Current.Response;
if (methodInfo != null)
{
try
{
object[] parameters = ConvertParameters(methodInfo, HttpContext.Current.Request);
val = InvokeMethod(control, methodInfo, parameters);
}
catch (Exception ex)
{
error = ex.Message;
}
WriteResult(resp, val, error); //把结果弄成json格式
resp.End();
}
}
Control control = s as Control;
MethodInfo methodInfo = null;
if (control != null)
{
if (control.GetType().FullName == CallBackType || control is Page)
{
if (control is Page || control.ClientID == CallBackID)
{
methodInfo = FindTargetMethod(control);
}
}
}
object val = null;
string error = null;
HttpResponse resp = HttpContext.Current.Response;
if (methodInfo != null)
{
try
{
object[] parameters = ConvertParameters(methodInfo, HttpContext.Current.Request);
val = InvokeMethod(control, methodInfo, parameters);
}
catch (Exception ex)
{
error = ex.Message;
}
WriteResult(resp, val, error); //把结果弄成json格式
resp.End();
}
}
static
object
[] ConvertParameters(
MethodInfo methodInfo,
HttpRequest req)
{
object[] parameters = new object[methodInfo.GetParameters().Length];
int i = 0;
foreach (ParameterInfo paramInfo in methodInfo.GetParameters())
{
object param = null;
string paramValue = req.Form["Ajax_CallBackArgument" + i];
if (paramValue != null)
{
if (paramInfo.ParameterType.IsArray)
{
Type type = paramInfo.ParameterType.GetElementType();
string[] splits = paramValue.Split(',');
Array array = Array.CreateInstance(type, splits.Length);
for (int index = 0; index < splits.Length; index++)
{
array.SetValue(Convert.ChangeType(splits[index], type), index);
}
param = array;
}
else
{
param = Convert.ChangeType(paramValue, paramInfo.ParameterType);
}
}
parameters[i] = param;
++i;
}
return parameters;
}
MethodInfo methodInfo,
HttpRequest req)
{
object[] parameters = new object[methodInfo.GetParameters().Length];
int i = 0;
foreach (ParameterInfo paramInfo in methodInfo.GetParameters())
{
object param = null;
string paramValue = req.Form["Ajax_CallBackArgument" + i];
if (paramValue != null)
{
if (paramInfo.ParameterType.IsArray)
{
Type type = paramInfo.ParameterType.GetElementType();
string[] splits = paramValue.Split(',');
Array array = Array.CreateInstance(type, splits.Length);
for (int index = 0; index < splits.Length; index++)
{
array.SetValue(Convert.ChangeType(splits[index], type), index);
}
param = array;
}
else
{
param = Convert.ChangeType(paramValue, paramInfo.ParameterType);
}
}
parameters[i] = param;
++i;
}
return parameters;
}
static
MethodInfo FindTargetMethod(Control control)
{
Type type = control.GetType();
string methodName = CallBackMethod;
MethodInfo methodInfo = type.GetMethod(methodName);
if (methodInfo != null)
{
object[] methodAttributes = methodInfo.GetCustomAttributes(typeof(AjaxMethodAttribute), true);
if (methodAttributes.Length > 0)
{
return methodInfo;
}
}
return null;
}
static object InvokeMethod(
Control control,
MethodInfo methodInfo,
object [] parameters)
{
object val = null;
try
{
val = methodInfo.Invoke(control, parameters);
}
catch (TargetInvocationException ex)
{
// TargetInvocationExceptions should have the actual
// exception the method threw in its InnerException
// property.
if (ex.InnerException != null)
{
throw ex.InnerException;
}
else
{
throw ex;
}
}
return val;
}
{
Type type = control.GetType();
string methodName = CallBackMethod;
MethodInfo methodInfo = type.GetMethod(methodName);
if (methodInfo != null)
{
object[] methodAttributes = methodInfo.GetCustomAttributes(typeof(AjaxMethodAttribute), true);
if (methodAttributes.Length > 0)
{
return methodInfo;
}
}
return null;
}
static object InvokeMethod(
Control control,
MethodInfo methodInfo,
object [] parameters)
{
object val = null;
try
{
val = methodInfo.Invoke(control, parameters);
}
catch (TargetInvocationException ex)
{
// TargetInvocationExceptions should have the actual
// exception the method threw in its InnerException
// property.
if (ex.InnerException != null)
{
throw ex.InnerException;
}
else
{
throw ex;
}
}
return val;
}
AJAX.NET中异步回调只允许WebService方式?
客户端js由ScriptManager实例注册回调page.PreRenderComplete += OnPagePreRenderComplete;
并在该函数中生成,返回客户页面上
<
asp:ScriptManager
runat
="server"
ID
="scriptManagerId"
>
< Scripts >
< asp:ScriptReference Path ="CallWebServiceMethods.js" />
</ Scripts >
< Services >
< asp:ServiceReference Path ="WebService.asmx" />
</ Services >
</ asp:ScriptManager >
< Scripts >
< asp:ScriptReference Path ="CallWebServiceMethods.js" />
</ Scripts >
< Services >
< asp:ServiceReference Path ="WebService.asmx" />
</ Services >
</ asp:ScriptManager >
针对那些定义WebMethod进行注册
以IHttpHandle来处理异步的回调
public
void
ProcessRequest(HttpContext context) ...
{
object target = null;
if (!methodData.IsStatic) target = Activator.CreateInstance(methodData.Owner.TypeData.Type);
....
_methodInfo.Invoke(target, actualParams);
}
if (HostingEnvironment.VirtualPathProvider.FileExists(virtualPath)) ... {
Type compiledType = null;
try ...{
compiledType = BuildManager.GetCompiledType(virtualPath);
if (compiledType == null) ...{ object page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(System.Web.UI.Page));
compiledType = page.GetType();
}
}
data = new WebServiceData(compiledType, pageMethods);
}
object target = null;
if (!methodData.IsStatic) target = Activator.CreateInstance(methodData.Owner.TypeData.Type);
....
_methodInfo.Invoke(target, actualParams);
}
if (HostingEnvironment.VirtualPathProvider.FileExists(virtualPath)) ... {
Type compiledType = null;
try ...{
compiledType = BuildManager.GetCompiledType(virtualPath);
if (compiledType == null) ...{ object page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(System.Web.UI.Page));
compiledType = page.GetType();
}
}
data = new WebServiceData(compiledType, pageMethods);
}