Form Post / 隐藏的窗体字段
特定的用户需要窗体的数据,并且它需要在单个请求到应用程序终止的任何阶段都保持。这些数据事实上可以是任意大小的,它随着每个form post在网络上向前和向后发送。
在传统的ASP中,这是在应用程序中暴露状态的通常的途径,特别是在多页面窗体应用程序中。但是在ASP.NET中这种技术不太适合了,因为只要你使用postback模型(也就是页面发回给自己),Web控件和ViewState自动处理了这些操作。ViewState是ASP.NET对这种技术的实现,我将在本文的后部分讨论它。访问通过POST发送的窗体值是使用HttpRequest对象的窗体集合完成的。在图6中,一个ASP.NET页面设置了某个用户的ID,在这以后它保持在一个隐藏的窗体字段中。后面的向任何页面的请求保留这个值,直到页面使用Submit按钮链接到其它的用户。
Form1.aspx
<h1>Form 1</h1> <form id="Application" method="post" runat="server"> <p>Your username: <asp:Label ID="lblUsername" Runat="server" /> </p> <asp:Panel Runat="server" ID="pnlSetValue"> <asp:validationsummary id="valSummary" Runat="server"> </asp:validationsummary> <TABLE> <TR> <TD colSpan="3">Set Hidden Form Username Variable:</TD></TR> <TR> <TD>Username</TD> <TD> <asp:textbox id="txtName" Runat="server"></asp:textbox></TD> <TD> <asp:requiredfieldvalidator id="nameRequired" runat="server" ControlToValidate="txtName" ErrorMessage="Name is required." Display="Dynamic">*</asp:requiredfieldvalidator></TD></TR> <TR> <TD colSpan="3"> <asp:button id="btnSubmit" Runat="server" Text="Set Value"> </asp:button></TD></TR></TABLE> </asp:Panel> <asp:Label ID="lblResult" Runat="server" /> </form> <form action="form2.aspx" method="post" name="form2" id="form2"> <input type="hidden" name="username" value="<%# username %>" > <input type="submit" value="Go to Form2.aspx" </form> Form1.aspx.cs private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) // 新的请求或者来自form2.aspx的请求 { // 检查窗体集合 if(Request.Form["username"] == null) pnlSetValue.Visible = true; else { //需要设置用户名值 pnlSetValue.Visible = false; username = Request.Form["username"].ToString(); lblUsername.Text = username; //数据绑定到隐藏的窗体字段值 this.DataBind(); } } }
private void btnSubmit_Click(object sender, System.EventArgs e) { if(IsValid) { //隐藏窗体来设置值 pnlSetValue.Visible = false; username = txtName.Text; lblResult.Text = "Username set to " + txtName.Text + "."; lblUsername.Text = username; this.DataBind(); } } Form2.aspx <h1>Form 2</h1> <form id="Application" method="post" runat="server"> <p>Your username: <asp:Label ID="lblUsername" Runat="server" /></p> </form> <form action="form1.aspx" method="post" id="form2" name="form2"> <input type="hidden" name="username" value="<%# username %>" > <input type="submit" value="Go to Form1.aspx" </form> Form2.aspx.cs private void Page_Load(object sender, System.EventArgs e) { if(Request.Form["username"] != null) { username = Request.Form["username"].ToString(); lblUsername.Text = username; this.DataBind(); } } |
代码段3.在ASP.NET中使用隐藏窗体字段
在ASP.NET中一个页面上只能存在一个服务器端窗体,并且该窗体必须提交返回到自身(仍然可以使用客户端窗体,没有限制)。隐藏窗体字段再也没有用于在.NET框架组件上建立的应用程序间传递数据的主要原因之一是.NET框架组件控件都可以使用ViewState自动维护自己的状态。ViewState简单地把使用隐藏窗体字段设置和检索值所包含的工作封装进一个使用简单的集合对象中。