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

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

    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函数,原形如下:

οnclick="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

点击下载源码

转载于:https://www.cnblogs.com/yanbinboy/archive/2008/11/07/1328574.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值