Page_Load和if(!IsPostBack)执行时成员变量值的问题

项目中稍不注意往往会在后台的类中使用普通的成员变量来保存值,如果将赋值操作放在Page_Load(object sender, EventArgs e)中的
if(!IsPostBack)块中时,当点击前台控件使用该值时,其值将会被清空,保存的值将会丢失,如下所示的前台页面:


    
             

s="<%=s %>"

 


其后台页面如下所示:

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在不同页面间也可以传递数据,容易引起冲突)。

你可能感兴趣的:(C#.net)