总结跨页传值及我所遇到的问题

    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")再进行类型转换来取值。或许效率会高一点吧(没测试过呵呵)。

  下面代码示例两者的差别

 

 1    源页
 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只能是一个否则造成编译错误。下面为代码示例了当使用跨提交时在目标访问源页得方式

 

 1 //使用Reference指示符
 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函数,原形如下:

onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(“Button1”;, “”, false, “”, “ReferenceTarget.aspx”;, false, false))"

    但这并不意味着一帆风顺,客户端可能不支持JavaScript,或者出现这样得情况。WebForm_PostBackOptions未定义。我就 遇到这样情况,打开他得源文件找到他得脚本引入地址

<script src="/WebSite1/WebResource.axd?d=3sBteobkrOuDvyCbOYcK5A2&amp;t=633617408508593750" type="text/javascript"></script>

   src中的代码复制下来,放到浏览器地址中运行,出现 错误。

很少见。在网上找到了关于“指定的参数已超出有效值的范围。参数名 utcDate”的解决方案大体说主要原因是程序集创建时间高于本机时间,且文中提出连个解决法案如下:

1、通过修改服务器系统时间,让其比Assembly的时间要晚,则可以了

2、通过修改Assembly的创建时间,让其早于服务器的时间,则可以了。

  根据文章中所提出得原因,我发现GAC中很多程序集得修改时间为11.8号(今天11.6),确实超前了,我也不知道事什么原因造成的.但不管总样问题还是解决了,我的解决方案是1,修改系统时间时期>11.8。但这本不是我得意图,因为现在还没有11.8号。对于解决方案二,我确实不知道怎么修改Assembly的创建时间,呵呵,节省时间吧。我没去深究了。有那个知道吗?

 

参考:http://m.cnblogs.com/38160/1241657.html

点击下载源码

posted on 2008-11-07 09:27  大斌锅  阅读(284)  评论(0编辑  收藏  举报