我在我的项目中使用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个原因?
我非常感谢你的想法。 谢谢你的想法。
答案 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 中增加它。