[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script

全面分析PostBack之Client Script


 -Written by 浪子@cnblogs.com (2006.08.14)

问题描述:

 

   继上文[JavaScript]自定义MessageBox ,我还剩下一个问题没有解决,即"如何获取control的完整的客户端代码"?。所以本文解决的问题只涉及PostBack的客户端Script,而不涉及服务端的PostBack机制如何运作。

 

问题分析:

  

   PostBack有2种方式

1、  通过__doPostBack(eventTarget, eventArgument),例如LinkButton;

2、  通过form的submit方式,例如采用UseSubmitBehaviorButton

   

   对于button,可能会有三种绘制方式:

1、  button的UseSubmitBehavior为true,并且没有触发验证事件;

采用form的submit方式,不需要描绘script

2、  button的UserSubmitBehavior为false,并且没有触发验证事件;

采用__doPostBack函数

3、  button有触发验证事件:

采用WebForm_DoPostBackWithOptions(options)函数


[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Scriptfunction WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.eventTarget = eventTarget;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.eventArgument = eventArgument;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.validation = validation;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.validationGroup = validationGroup;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.actionUrl = actionUrl;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.trackFocus = trackFocus;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    this.clientSubmit = clientSubmit;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script}
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script 
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Scriptfunction WebForm_DoPostBackWithOptions(options) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    var validationResult = true;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    if (options.validation) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        if (typeof(Page_ClientValidate) == 'function') [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            validationResult = Page_ClientValidate(options.validationGroup);
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    if (validationResult) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            theForm.action = options.actionUrl;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        if (options.trackFocus) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            var lastFocus = theForm.elements["__LASTFOCUS"];
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                if (typeof(document.activeElement) == "undefined") [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    lastFocus.value = options.eventTarget;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                else [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    var active = document.activeElement;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    if ((typeof(active) != "undefined") && (active != null)) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                        if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                            lastFocus.value = active.id;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                        }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                        else if (typeof(active.name) != "undefined") [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                            lastFocus.value = active.name;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                        }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    if (options.clientSubmit) [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script        __doPostBack(options.eventTarget, options.eventArgument);
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script    }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script}
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script



 

 

 

问题解决:

 

   我需要的是采集PostBack的Client Script,所以只需要获取__doPostBack或者WebForm_DoPostBackWithOptions(options)函数,以便传给KMessageBox进行事件挂载。

 

   按上面的分析我们已经知道什么情况下使用__doPostBack,什么情况下使用WebForm_DoPostBackWithOptions(options)。

  分析一下Reflector出来的Button源码:
 

[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client ScriptOnPreRender
 1[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script if ((this.Page != null) && base.IsEnabled)
 2[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script      [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
 3[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            if ((this.CausesValidation && (this.Page.GetValidators(this.ValidationGroup).Count > 0)) || !string.IsNullOrEmpty(this.PostBackUrl))
 4[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
 5[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                  this.Page.RegisterWebFormsScript();
 6[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            }
 7[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            else if (!this.UseSubmitBehavior)
 8[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
 9[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                  this.Page.RegisterPostBackScript();
10[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script            }
11[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script      }
12[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script

    有了这段代码,我们就可以很清晰的得到服务端如何决定采取什么方式来绘制客户端的PostBack Script了

[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client ScriptDoPostBackWithOptions
1[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Scriptprivate string gDoPostBackWithOptions = "WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(\"[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{0}\", \"[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{1}\", {2}, \"[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{3}\", \"[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{4}\", {5}, {6}))";

   
[JavaScript]自定义MessageBox续-全面分析PostBack之Client ScriptIButtonControl button = (IButtonControl)control;
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    if ((button.CausesValidation && (this.Page.GetValidators(button.ValidationGroup).Count > 0)) || !string.IsNullOrEmpty(button.PostBackUrl))
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                        strOnClickScript = string.Format(gDoPostBackWithOptions, control.ClientID, button.CommandArgument, button.CausesValidation.ToString().ToLower(), button.ValidationGroup, button.PostBackUrl, "false", "true");
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    }
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    else
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    [JavaScript]自定义MessageBox续-全面分析PostBack之Client Script{
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                        strOnClickScript = Page.ClientScript.GetPostBackEventReference(control, button.CommandArgument);
[JavaScript]自定义MessageBox续-全面分析PostBack之Client Script                    }


     至此KMessageBox服务端的封装工作全部结束。做到,不影响原来的编码方式,只需要简单的执行一下KMessageBox的RegisterConfrim函数为control注册一下客户端事件就搞定一切。

分类: 1.首页原创精华.NET区123,JavaScript/CSS



本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2006/08/14/PostBack_ClientScript.html,如需转载请自行联系原作者

上一篇:QQ微信微博联合登录流程总结


下一篇:创建非对称的平衡:谈谈网页设计中的不对称设计技巧