AjaxManager粗读

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()在页面的其他数据返回前立即结束。
{
                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;
        }

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;
        }

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 >

    针对那些定义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);

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值