总结跨页传值及我所遇到的问题
asp.net的跨页传递很好用,相信大家对这些也在熟悉不过了。利用Querystring,Sessions,Cookies,Application这些基于web特性得很直接,这不是我所要强调得重点,我要说的是Asp.net 特有的方式跨网页提交和Server.Transfer.然后说说我用跨网页提交时所遇到的问题。
1.Server.Transfer跨页传值
Server.Transfer有两种重载方式,(1)public void Transfer(string path, bool preserveForm), (2)public void Transfer(string path). preserveForm表示告诉服务器是否保存用于描述源页面值的Form,单个参数得重载形式preserveForm==true;
这个参数很有用,当我们设置preserveForm==true时,我们其实可以直接通过Requet.Form取得源页面表单得值,当然我们也可以使用PreviousPage取得值,但我认为前者更好,不需PreviousPage.FindControl("xxx")再进行类型转换来取值。或许效率会高一点吧(没测试过呵呵)。
下面代码示例两者的差别
2
3 protected void btPostBack_Click( object sender, EventArgs e)
4 {
5 Server.Transfer( " ~/TargetServerTransfer1.aspx " , true );
6 }
7 protected void Button1_Click( object sender, EventArgs e)
8 {
9 Server.Transfer( " ~/TargetServerTransfer2.aspx " , false );
10 }
11
12 目标页
13
14 // TargetServerTransfer1.aspx
15
16 protected void Page_Load( object sender, EventArgs e)
17 {
18 Response.Write(Request.Form[ " tbName " ].ToString());
19 if (PreviousPage != null )
20 {
21 TextBox bt = (TextBox)PreviousPage.FindControl( " tbName " );
22 Response.Write(bt.Text);
23 }
24 } // 这样页面会重复输出源页面TextBox,id=tbName的text属性值。
25
26 // TargetServerTransfer2.aspx
27
28 protected void Page_Load( object sender, EventArgs e)
29 {
30 // Response.Write(Request.Form["tbName"].ToString()); // 源页面表单值没被保存 不能这样取值
31 if (PreviousPage != null )
32 {
33
34 TextBox bt = (TextBox)PreviousPage.FindControl( " tbName " );
35 Response.Write(bt.Text);
36 }
37 } // text值只被输出一次
38
为什么Server.Transfer("~/TargetServerTransfer1.aspx",true),你就能采用Request.Form["tbName"],这是因为此时目标网页再被访问时,它使用的Response是从源网页中取得的。但要注意的这种技术有一个副作用,在页面进行重定向时,客户端的URL仍然会保持源页面的URL,这可能会使客户认为他们所获得的数据是源页面产生的。当然,在大多数情况下,这不是问题,但是这将使调试变得更困难,而且这种方式只适合站内。
2.跨网页提交
asp.net 2.0 中不但能过PostBack到本页,而且可以PostBack到其他页,这使跨网页提交成为可能,但你必须在目标页时指定他的源页,以便取得目标页中表单得值,可使用两种方式
(1)<%@ PreviousPageType VirtualPath="" %>
(2)<%@ Reference VirtualPath="" %>
两者得主要区别在于使用Reference 指示符,它是将PreviousePage转换成与源网页相同得类型,具有强类型的特性。这样你就可以通过智能提示来直接访问。且你在目标页中可以指定多个Reference ,PreviousPageType只能是一个否则造成编译错误。下面为代码示例了当使用跨提交时在目标访问源页得方式
2
3 if (PreviousPage != null )
4 {
5 ReferenceSource refer = (ReferenceSource)PreviousPage;
6 Response.Write(refer.getTextName);
7 }
8
9 // 使用PreviousPageType指示符
10
11 if (PreviousPage != null )
12 {
13 if (Page.IsCrossPagePostBack)
14 {
15 TextBox bt = (TextBox)PreviousPage.FindControl( " tbName " );
16 Response.Write(bt.Text);
17 }
18 }
19
注意:1.在源页中指定使用Button 得PostBackUrl属性指定你要跨页提交的目标页面。所有实现了System.Web.UI.WebControls.IbuttonControl接口的Web控件都有跨网页提交的特性。
2.当目标网页访问PreviousPage属性时可以获得源页面的数据,ASP.NET运行时装载并执行了源页面。这将引发ProcessChildRequest事件的发生。而且,它还会引发Page_Init事件、Page_Load和任何其他的源页面按钮单击事件。我们要避免由于不小心进行误操作,所以最好通过IsCrossPostBack属性来确认是否为一个跨网页提交发生。但这只对PreviousPageType指示符有效。如果你使用Reference指示符IsCrossPostBack属性是为false的,正如上面代码所示。
实际上当你指定PostBackUrl为某个页面时,ASP.NET框架将相应的控件绑定到一个新的叫WebForm_DoPostBackWithOptions的JavaScript函数,原形如下:
οnclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(“Button1”;, “”, false, “”, “ReferenceTarget.aspx”;, false, false))"
但这并不意味着一帆风顺,客户端可能不支持JavaScript,或者出现这样得情况。WebForm_PostBackOptions未定义。我就 遇到这样情况,打开他得源文件找到他得脚本引入地址
<script src="/WebSite1/WebResource.axd?d=3sBteobkrOuDvyCbOYcK5A2&t=633617408508593750" type="text/javascript"></script>
很少见。在网上找到了关于“指定的参数已超出有效值的范围。参数名 utcDate”的解决方案大体说主要原因是程序集创建时间高于本机时间,且文中提出连个解决法案如下:
1、通过修改服务器系统时间,让其比Assembly的时间要晚,则可以了
2、通过修改Assembly的创建时间,让其早于服务器的时间,则可以了。
根据文章中所提出得原因,我发现GAC中很多程序集得修改时间为11.8号(今天11.6),确实超前了,我也不知道事什么原因造成的.但不管总样问题还是解决了,我的解决方案是1,修改系统时间时期>11.8。但这本不是我得意图,因为现在还没有11.8号。对于解决方案二,我确实不知道怎么修改Assembly的创建时间,呵呵,节省时间吧。我没去深究了。有那个知道吗?