PostBack和ViewState

时间:2013-06-03 15:39:38

标签: c# viewstate

在使用像

这样的ViewState变量时,我看到了一些似乎惯用的代码
protected void Page_Load(object sender, EventArgs e)
    {
        //find if this is the initial get request
        //after you click a button, this code will not run again
        if (!IsPostBack)
        { 
            if(ViewState["clicks"] ==null)
            {
                ViewState["clicks"] = 0;
            }
            //we're using the ViewState[clicks] to initialize the text in the text box
            TextBox1.Text = ViewState["clicks"].ToString();
        }
    }

有人可以指出我们绝对需要检查的情况 if(ViewState["clicks"] == null)或程序无法运行?我尝试添加另一个按钮,首先单击新按钮,然后单击Button1,程序仍然运行正常,即使在Button 2点击后它是一个回发,程序仍然在我单击按钮1多次后运行相同次。

2 个答案:

答案 0 :(得分:1)

因为ViewState是一个字典对象(StateBag)如果您尝试从不存在的视图状态中获取值,则不会引发异常。为了确保您想要的值处于视图状态,您可以按照自己的要求进行操作。

此外,如果您正在开发将在ViewState上禁用的页面上使用的控件或共享组件,则ViewState值将为null。

这些比特来自:http://msdn.microsoft.com/en-us/library/ms228048%28v=vs.85%29.aspx

答案 1 :(得分:0)

  

有人可以指出我们绝对需要检查的情况   if(ViewState [“clicks”] == null)或程序不会运行?

不确定

    protected void Page_Load(object sender, EventArgs e)
    {
        //find if this is the initial get request
        //after you click a button, this code will not run again
        if (!IsPostBack)
        {
            //if (ViewState["clicks"] == null)
            //{
            //    ViewState["clicks"] = 0;
            //}
            //we're using the ViewState[clicks] to initialize the text in the text box
            TextBox1.Text = ViewState["clicks"].ToString();
        }
    }

那会破坏,因为你试图在你需要不为空的东西上调用一个方法,但在第一页加载时,它将为null。如果您在我们分配之前询问为什么我们首先测试它为null,那么您应该知道if-null测试不是为了分配的好处,它是为了设置文本框文本的行的好处。使用代码中存在的IF块,我们可以保证在使用ViewState [“clicks”]时.ToString()我们不会尝试在null上调用ToString()(因为ViewState [“clicks”]已被设置在其他地方或已被这个IF bock默认

  

按钮2后点击它是一个回发,程序仍然   我多次点击按钮1后功能相同

但是..当它是一个回发时,整个代码块根本不会运行..如果它的回发将永远不会在PageLoad中使用ViewState