ViewState背后的ASPX代码未保存

时间:2015-11-25 20:18:26

标签: asp.net postback viewstate

我正在尝试使用ViewState在回发期间保留文本框的输入。这是代码:

 private Label store_Incident_Number = new Label();
 private TextBox Incident_Number = new TextBox();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["Incident_Number"] != null)
        {                
            store_Incident_Number.Text = "TEST" + (string)ViewState["Incident_Number"];
            Panel1.Controls.Add(store_Incident_Number);
        }
    }

    void Page_PreRender(object sender, EventArgs e)
    {
        ViewState.Add("Incident_Number", Incident_Number.Text);

    }  

上面的代码位于我的default.aspx.cs(代码隐藏)中。 Panel1是一个asp控件,位于表单标记之外的网页上。我试着效仿这个例子:https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx

我希望在页面回发后将Incident_Number文本框的文本保存到标签上,但它似乎不起作用,我无法弄清楚问题。请注意,文本框会动态添加到页面的表单中,并在每次回发时重新创建。我的问题是如何编写代码以在页面回发后保留文本框的值?

  编辑:修正了!请看我接受的答案。此外,任何事件处理程序   或其他有可能触发另一个回发的进程   在Page_Init期间将刷新保存在viewstate中的值(即保存的文本消失)。

2 个答案:

答案 0 :(得分:2)

这是因为页面加载方法在预渲染之前运行。您可以通过Google asp.net页面lifecicle查找更多详细信息。

您在此处的基本操作是在将标签值添加到视图状态之前加载标签值。

此外,如果你能告诉我们你是如何进行回发的,那将会有所帮助。例如,因为点击事件也是页面生命周期的一部分,这可能会改变一些事情。

答案 1 :(得分:1)

正如我在评论中提到的,您不会让WebForms系统为您工作。这是一个动态创建控件维护视图状态的表单示例。根据您的描述,该小组不在表格中。

显示页面时,您可以输入新文本并重复单击提交。 TextBox值将自动保留。

<强> Default.aspx的

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
    <asp:Panel ID="Panel1" runat="server"></asp:Panel>
</body>
</html>

<强> Default.aspx.cs

using System;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    private Label store_Incident_Number = new Label();
    private TextBox Incident_Number = new TextBox() { ID = "TextBox1" };
    private Button SubmitButton = new Button() { ID = "Button1", Text = "Submit" };


    protected void Page_Init(object sender, EventArgs e)
    {
        // what is created during this event has viewstate restored to it
        Panel1.Controls.Add(store_Incident_Number);
        form1.Controls.Add(Incident_Number);
        form1.Controls.Add(SubmitButton);
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        // the viewstate has already been restored so you can access the content of the TextBox
        store_Incident_Number.Text = Incident_Number.Text;
    }
}