我已经看到了很多这个问题,而且通常是因为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
的目的。
答案 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;
}
祝你好运:)。