WebForm_DoPostBackWithOptions实现跨页面提交(转)

判断是否为跨页面提交

  跨页面提交的时候,源页面控件的内容被提交到目标页面,然后浏览器执行POST操作(注意,不是GET)。在ASP.NET 1.x中由于页面都是自己提交给自己,可以通过Page的IsPostBack属性来判断是否为页面提交。但是在跨页面提交的时候,目标页面的IsPostBack属性为false。如果要判断是否为跨页面提交,可以对目标页面的PreviousPage属性返回的引用页面的IsCrossPagePostBack属性进行判断,如下面的代码所示:

if(PreviousPage != null)

 

{

 if(PreviousPage.IsCrossPagePostBack == true)

 {

  Label1.Text = "跨页面提交";

 }

}

else

{

 Label1.Text = "非跨页面提交";

}

  注意,如果当前页面不是跨页面提交的目标页面,则其PreviousPage属性为空。

  跨页面提交 VS Server.Transfer

  ASP.NET 2.0中,无论是跨页面提交还是使用Server.Transfer操作,都可以使用Previousoage属性来获取对源页面的引用。如果要区分它们,可以使用上面介绍的方法。

  下面是跨页面提交与Server.Transfer之间的一些区别:

 

属 性

 

 

跨页面提交

 

 

Server.Transfer

 

IsPostBack false false
PreviousPage 源页面的引用 源页面的引用
PreviousPage.IsCrossPagePostBack true false
IsCrossPagePostBack false false
IsCallBack false false

  跨页面提交是客户端浏览器的行为,而Server.Transfer则是服务器端的行为。在后面的小节中,我们会分析跨页面提交时客户端浏览器是如何实现提交的。

  对跨页面提交的简单分析

  在上面的例子中,我们都提到设置Button的PostBackUrl属性来实现跨页面提交。其实只要实现IButtonControl接口的控件均可以实现这一点。Button, ImageButton, 和 LinkButton都实现了IButtonControl接口。通过实现IButtonControl,自定义控件也可以有表单中的按钮所具有的跨页面提交的功能。IButtonControl接口聚合了ASP.NET 1.x支持的多数按钮控件(包括一些html按钮控件)的一些属性。

  当设置了Button控件的PostBackUrl属性之后,ASP.NET运行时将为按钮控件的所对应的的html元素绑定一段新的JavaScript代码。使用新的 WebForm_DoPostBackWithOptions函数取代常规以前所使用的__doPostback函数。具体的HTML代码示例如下:

<input type="submit" name="Button2" value="Postback to Second Page" οnclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("Button2", "", false, "", "SecondPage.aspx", false, false))" id="Button2" />

  上述代码中的WebForm_DoPostBackWithOptions函数与WebForm_PostBackOptions函数的javascript代码如下:

function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {

 

this.eventTarget = eventTarget;

this.eventArgument = eventArgument;

this.validation = validation;

this.validationGroup = validationGroup;

this.actionUrl = actionUrl;

this.trackFocus = trackFocus;

this.clientSubmit = clientSubmit;

}

function WebForm_DoPostBackWithOptions(options) {

var validationResult = true;

if (options.validation) {

if (typeof(Page_ClientValidate) == 'function') {

validationResult = Page_ClientValidate(options.validationGroup);

}

}

if (validationResult) {

if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {

theForm.action = options.actionUrl;

}

if (options.trackFocus) {

var lastFocus = theForm.elements["__LASTFOCUS"];

if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {

if (typeof(document.activeElement) == "undefined") {

lastFocus.value = options.eventTarget;

}

else {

var active = document.activeElement;

if ((typeof(active) != "undefined") && (active != null)) {

if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {

lastFocus.value = active.id;

}

else if (typeof(active.name) != "undefined") {

lastFocus.value = active.name;

}

}

}

}

}

}

if (options.clientSubmit) {

__doPostBack(options.eventTarget, options.eventArgument);

}

}

  用户点击按钮时,当前表单将内容提交给PostPageUrl属性所指定的目标页面。当页面中含有可以实现跨页面提交功能的控件时,页面会创建一个name为__PREVIOUSPAGE的隐藏字段,此字段包含了源页面的信息。目标页面则使用此信息来创建一个完整状态的引用来调用源页面对象。上述隐藏字段的相关HTML代码示例如下:

<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="ND3_1GqjDSUeAC3yLYVz-eQrkTzZLYFHliIFf7mMQVBdmwZmFi8HG4mzX5pfZY0n0" />

  总 结

  ASP.NET 2.0 新增的跨页面提交功能,让我们的开发过程有了更加灵活的选择。在使用跨页面提交的时候,我们要根据实际的情况选择合适的方式来读取源页面中的信息。如果源页面与目标页面处于同一个应用程序之内,我们可以选择使用@PreviousPageType指令来指定源页面,这样就可以使用强类型引用的好处。

  由于ASP.NET中的每个页面类所包含的子控件对应的是protected成员,所以您不能直接通过PreviousPage引用来访问源页面中的控件,而先需要将源页面中需要被访问的属性公开出来。同时,建议您只将需要的信息作为公共属性公开,以减少可能被潜在的恶意用户使用的信息。

你可能感兴趣的:(ASP.NET)