在回发时设置viewstate
时间:2020-03-05 18:46:57 来源:igfitidea点击:
我试图在按下按钮时设置ViewState变量,但是它仅在第二次单击按钮时有效。下面是代码:
protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack) { lblInfo.InnerText = String.Format("Hello {0} at {1}!", YourName, DateTime.Now.ToLongTimeString()); } } private string YourName { get { return (string)ViewState["YourName"]; } set { ViewState["YourName"] = value; } } protected void btnSubmit_Click(object sender, EventArgs e) { YourName = txtName.Text; }
我有什么想念的吗?这是设计文件的表单部分,就像POC一样非常基本:
<form id="form1" runat="server"> <div> Enter your name: <asp:TextBox runat="server" ID="txtName"></asp:TextBox> <asp:Button runat="server" ID="btnSubmit" Text="OK" onclick="btnSubmit_Click" /> <hr /> <label id="lblInfo" runat="server"></label> </div> </form>
PS:该示例非常简化,"使用txtName.Text
代替ViewState"不是正确的答案,我需要将信息显示在ViewState中。
解决方案
回答
" Page_Load"在" btnSubmit_Click"之前触发。
如果我们想在发回事件触发后执行某些操作,请使用Page_PreRender
。
//this will work because YourName has now been set by the click event protected void Page_PreRender(object sender, EventArgs e) { if (Page.IsPostBack) lblInfo.InnerText = String.Format("Hello {0} at {1}!", YourName, DateTime.Now.ToLongTimeString()); }
基本顺序为:
- 页面初始化触发(init无法访问ViewState)
- 读取ViewState
- 页面加载触发
- 发生任何事件
- 预渲染火灾
- 页面渲染