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


本文示例源代码或素材下载

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
3protectedvoidbtPostBack_Click(objectsender,EventArgse)
4 {
5   Server.Transfer("~/TargetServerTransfer1.aspx",true);
6 }
7 protectedvoidButton1_Click(objectsender,EventArgse)
8 {
9   Server.Transfer("~/TargetServerTransfer2.aspx",false);
10 }
11
12目标页
13
14//TargetServerTransfer1.aspx
15
16protectedvoidPage_Load(objectsender,EventArgse)
17 {
18   Response.Write(Request.Form["tbName"].ToString());
19   if(PreviousPage!=null)
20   {
21    TextBoxbt=(TextBox)PreviousPage.FindControl("tbName");
22    Response.Write(bt.Text);
23   }
24 }//这样页面会重复输出源页面TextBox,id=tbName的text属性值。
25
26//TargetServerTransfer2.aspx
27
28protectedvoidPage_Load(objectsender,EventArgse)
29  {
30    //Response.Write(Request.Form["tbName"].ToString());//源页面表单值没被保存不能这样取值
31    if(PreviousPage!=null)
32    {
33
34      TextBoxbt=(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只能是一个否则造成编译错误。下面为代码示例了当使用跨提交时在目标访问源页得方式

  Code

1//使用Reference指示符
2 if(PreviousPage!=null)
3    {
4      if(PreviousPage.IsCrossPagePostBack)
5      {
6        ReferenceSourcerefer=(ReferenceSource)PreviousPage;
7        Response.Write(refer.getTextName);
8      }
9    }
10 //使用PreviousPageType指示符
11 
12 if(PreviousPage!=null)
13    {
14      if(PreviousPage.IsCrossPagePostBack)
15      {
16        TextBoxbt=(TextBox)PreviousPage.FindControl("tbName");
17        Response.Write(bt.Text);
18      }
19    }
注意:1.在源页中指定使用Button 得PostBackUrl属性指定你要跨页提交的目标页面。所有实现了System.Web.UI.WebControls.IbuttonControl接口的Web控件都有跨网页提交的特性。

  2.当目标网页访问PreviousPage属性时可以获得源页面的数据,ASP.NET运行时装载并执行了源页面。这将引发ProcessChildRequest事件的发生。而且,它还会引发Page_Init事件、Page_Load和任何其他的源页面按钮单击事件。我们要避免由于不小心进行误操作,所以最好通过IsCrossPostBack属性来确认是否为一个跨网页提交发生。

  实际上当你指定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的创建时间,呵呵,节省时间吧。我没去深究了。有那个知道吗?

  


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3