专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 跨页模板:ASP.NET 2.0 中实现跨页提交 »正文

跨页模板:ASP.NET 2.0 中实现跨页提交

来源: 发布时间:星期日, 2008年12月14日 浏览:54次 评论:0
在ASP.ET 1.x时候很多朋友可能需要进行跨页提交处理也就是从页面A能够提交到页面B甚至区别Control其目标处理页面也各不相同尤其是从ASP/JSP/PHP转过来开发人员可能更有这种需求但很不幸在ASP.NET 1.x时候处理这种跨页请求是十分丑陋需要非常多“窍门技巧化”处理
在ASP.NET 2.0时候对于跨页提交已经有了非常合理解决方案以下就是个举例
SourcePage.aspx: 请注意Button1PostBackUrl属性设置
<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> public YourName { get { this.TextBox1.Text; } }</script><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>Untitled Page</title></head><body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="请输入您姓名" Width="183px"></asp:Label> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="提交" PostBackUrl="~/TargetPage.aspx" /></div> </form></body></html>
  
TargetPage.aspx:请注意PreviousPageType属性设置
<%@ Page Language="C#" %><%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> protected void Page_Load(object sender, EventArgs e) { this.Label1.Text = PreviousPage.YourName; }</script><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>Untitled Page</title></head><body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" ></asp:Label> </div> </form></body></html>

OK就通过这么简单两个属性设置就可以非常方便得到跨页提交特性
读取源页面信息
  ASP.NET 2.0中ButtonControl控件有个新增属性PostBackUrl用来设置需要提交目标页面只要指定ButtonControl控件PostBackUrl属性就可以提交到其它页面我们可以在页面中使用多个Control控件配置其PostBackUrl属性提交到区别页面当然也可配置多个页面提交到同个页面
  在跨页面提交的后通常我们需要从源页面中读取Control控件信息(即由浏览器发送信息)以及源页面公共属性
读取Control控件
  ASP.NET 2.0Page类新增了个PreviousPage属性顾名思义目标页面中这个属性包含对源页面引用这样就可以在目标页面中通过PreviousPage属性访问源页面信息我们般使用FindControl思路方法来查找源页面上Control控件并读取这些Control控件下面代码介绍说明了该思路方法使用:
(Page.PreviousPage != null){ TextBox txtName = (TextBox)Page.PreviousPage.FindControl("txtName"); (txtName != null) { Label1.Text = txtName.Text; }}

  当我们想查找源页面中Control控件属于另个Control控件或者是模板的中就不能直接使用FindControl思路方法来读取它而是应该先获取对该容器引用然后才能在该容器中查找要获取Control控件下面例子中FirstPage.aspx页面中包含个PanelControl控件其ID为MainPanel它还包含ID为UserNameTextBoxControl控件具体代码如下:
Panel MainPanel = (Panel)PreviousPage.FindControl("MainPanel"); (MainPanel != null){ TextBox UserName = (TextBox)MainPanel.FindControl("UserName"); (UserName != null) { Label1.Text = UserName.Text; }}{ Label1.Text = "Cannot find UserName control.";}


读取源页面公共属性
  旦在目标页面中获取了PreviousPage引用就能访问源页面中公共Control控件属性同样也可访问源页面中公共属性当然我们需要预先在源页面中公开需要被访问属性方可在目标页面中访问
  若要获取源页面公共成员必须先获取对源页面强类型引用就像第个例子中我们可以使用@PreviousPageType指令来指定源页面它有两个属性分别为:VirtualPath和TypeName使用VirtualPath属性指定来源页虚拟路径(包含文件名)也可以使用TypeName指定源页面属性注意只能指定其中两者都指定就会失效如第个例子中所示:
<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>

  如果使用了@PreviousPageType指令目标页面中PreviousPage 属性被强类型化为源页面因此可以直接引用源页面公共成员要获取对源页面强类型引用种思路方法是在目标页面中包含个@Reference 指令就像引用要在页面中使用其它任何类型在这种情况下你可以在目标页面中获取目标页面PreviousPage属性并将其强制转换为源页面类型如下面代码所示:
SourcePage_aspx sourcePage;sourcePage = (SourcePage_aspx) PreviousPage;Label1.Text = sourcePage.UserName;


读取源页面中Form信息
  如果源页面和目标页面属于同个 ASP.NET 应用则目标页中PreviousPage属性包含对源页面引用在没有使用@PreviousPageType指令情况下目标页面中PreviousPage 属性类型化为Page
  注意如果该页不是跨页发送目标页面或者目标页面位于区别应用则不会化PreviousPage属性
  如果源页面和目标页面属于区别应用甚至是区别网站WebSite那就无法直接获取源页面上Control控件但可以从Request.Form中读取发送数据还有个需要注意问题源页面视图状态经过Hash处理所以不能从源页面中读取视图状态如果要在源页面中存储值并让这些值可供其他应用目标页使用可以将这些值作为串存储在源页面隐藏字段中并在目标页面中通过 Request.Form 来访问它们
判断是否为跨页面提交
  跨页面提交时候源页面Control控件内容被提交到目标页面然后浏览器执行POST操作(注意不是GET)在ASP.NET 1.x中由于页面都是自己提交给自己可以通过PageIsPostBack属性来判断是否为页面提交但是在跨页面提交时候目标页面IsPostBack属性为false如果要判断是否为跨页面提交可以对目标页面PreviousPage属性返回引用页面IsCrossPagePostBack属性进行判断如下面代码所示:
(PreviousPage != null){ (PreviousPage.IsCrossPagePostBack true) { Label1.Text = "跨页面提交"; }}{ Label1.Text = "非跨页面提交";}
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: