回发后ViewState变量重置

时间:2013-12-16 17:58:51

标签: c# asp.net postback viewstate page-lifecycle

我已经看到了很多这个问题,而且通常是因为ViewState变量在页面生命周期中过早评估,或者EnableViewState是错误的,但我检查了两者这些和他们是我所期望的那样。

我的代码:

public Int32 MyNumber
{
    get
    {
        if (ViewState["MyNumber"] != null)
        {
            return (Int32)ViewState["MyNumber"];
        }

        return 0;
    }
    set
    {
        ViewState["MyNumber"] = value;
    }
}

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (!this.IsPostBack)
    {
        MyNumber = 23;
    }
}

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);

    var numberValue = MyNumber;
}

首次调用OnPreRender时,numberValue为23.此后的每次调用都为0.每次有回发时,它似乎都会重置。

问题

如何在回发后让值继续存在?

我尝试过什么

将值赋值放在支票之外进行回发,但这样就失去了首先使用ViewState的目的。

2 个答案:

答案 0 :(得分:0)

我没有意识到还有一个ViewStateMode会导致此行为,如果设置为Disabled,它就是(在母版页上)。

我现在已将其设置为Enabled,我的ViewState值仍然存在,因为我希望。

答案 1 :(得分:-1)

实际上你的代码块激励中有一个缺失的顺序,并且每次在post pack之间使值重置为零:) ...在onload方法中你在代码块之前编写了base.onload()方法将Viewstate重置为0。

请修改代码:

  public Int32 MyNumber
        {
            get
            {
                if (ViewState["MyNumber"] != null)
                {
                    return (Int32)ViewState["MyNumber"];
                }

                return 0;
            }
            set
            {
                ViewState["MyNumber"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(MyNumber.ToString()); // Result now is 23 :)
        }

        protected override void OnLoad(EventArgs e)
        {

            // I replaced the order of the code here to get the value of the Viewstate in MyNumber property ..
            if (!this.IsPostBack)
            {
                MyNumber = 23;
            }

            base.OnLoad(e);
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            var numberValue = MyNumber;
        }

祝你好运:)。