有时ViewState变量是丢失的值

时间:2017-03-09 08:03:36

标签: c# asp.net webforms


我在我的项目中使用webform(在asp.net 4.5中)。 但有时候,我的viewstate变量的价值就会丢失。 一天只出现1或2次。

我在onpreload中有一个片段代码:

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

        if (!EnableViewState || Form == null)
            return;
        if (Session["postbackError"] != null)
        {
            Session["postbackError"] = null;

            //write this error to log file
            var ex = new Exception("Lost viewstate");
            LogErrorUltil.LogError(ex);
        }
        if (IsPostBack && Form.Attributes["postback"] == null)
        {
            Session["postbackError"] = true;            
        }
        Form.Attributes["postback"] = "1";
    }

我在日志中看到了消息" Lost viewstate"写在日志文件中。
但我确定:
1. Web.config未刷新
2. IIS的应用程序池不会被回收。

你能给我一个想法吗?#34; Lost viewstate"写入日志文件除了以上2个原因?

我非常感谢你的想法。 谢谢你的想法。

2 个答案:

答案 0 :(得分:0)

没有必要在会话中保留错误消息,尤其是将它们保存在日志文件中时。

<强>的Web.config

Web.config未刷新?

如果您修改了web.config,则需要重建应用程序,因此Form.Attributes["postback"]将为null

如果未刷新Web.config,则ViewState将保留Form.Attributes["postback"]值。没有必要为事件OnPreLoad的每次调用设置其值。使用OnLoad事件,您可以设置ViewState注意的所有值。

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostback)
    {
        return;
    }

    // Set here all the values that will be maintained by 'ViewState'
    Form.Attributes.Add("postback", "1");
    TextBox1.BackColor = System.Drawing.Color.Wheat;

    /* 
       Set runat="server" and enableviewstate="true" on common html elements 
       if you need to preserve it's values and styles between postbacks
    */
}


IIS的应用程序池未被回收

如果您回收App pool,则会丢失ViewState,如果没有,ViewState会在回发之间保留,并在您请求其他页面时丢失。


EnableViewState =“false”或ViewStateMode =“已禁用”
您需要像设置Form.Attributes["postback"]属性的值一样设置。

答案 1 :(得分:0)

首先,您在问题中多次提到ViewState,但 您的代码未使用ViewState 。相反,它使用 SessionState

Form.Attributes["postback"] = "1";是将名为 回发 的属性添加到 表单 标记。 <form ... postback="1"> 不是ViewState。这种方法非常奇怪。

Default SessionState timeout is 20 minutes.

这意味着如果用户在空闲20分钟后访问服务器,则SessionState不再有效,并且将返回null。

如果您想要超过20分钟,可以在 web.config 中增加它。