项目中稍不注意往往会在后台的类中使用普通的成员变量来保存值,如果将赋值操作放在Page_Load(object sender, EventArgs e)中的
if(!IsPostBack)块中时,当点击前台控件使用该值时,其值将会被清空,保存的值将会丢失,如下所示的前台页面:
<body>
<form runat="server">
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"/>
</form>
<p>s="<%=s %>"</p>
</body>
其后台页面如下所示:
public partial class ceshi : System.Web.UI.Page
{
protected string s { set; get; }
protected void Page_Load(object sender, EventArgs e)
{
// s = "1";
if(!IsPostBack)
{
s = "2";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
}
}
运行页面,第一次不是响应控件回送而运行,因此Page_Load和if(!IsPostBack)块都会执行,结果为:
s="2"
此时不点击页面内的任何控件,直接刷新,依然会被认为不是响应控件回送而运行,因此Page_Load和if(!IsPostBack)块都会执行,结果为:
s="2"
此时再点击Button按钮,Page_Load会运行,而if(!IsPostBack)块不会执行,s的值会被清空,结果为:
s=""
此时刷新页面或者点击Button按钮,结果相同,都是Page_Load会运行,而if(!IsPostBack)块不会执行,s的值会被清空,结果为:
s=""
因此,Page_Load运行时,以前仅仅保存在普通成员变量中的内容会丢失,其值将变为构造函数或默认初始化指定的初始值(若上述代码有构造函数初始化s="7",则初始值为"7")。因此为了使if(!IsPostBack)块中一次的赋值给后续控件使用,如果仅仅在同一页面传递数据,成员变量最好使用viewState保存数据,即上面的
可以改为protected string s { set { ViewState["s"] = value; } get { return ViewState["s"] as string; } }(session,cookie等也可以,但ViewState仅在同一页面有效,而Session和Cookie在不同页面间也可以传递数据,容易引起冲突)。
探讨了在ASP.NET中使用ViewState保存数据的重要性,避免在Page_Load事件中不当使用普通成员变量导致的数据丢失问题。
280

被折叠的 条评论
为什么被折叠?



