0

我见过一些在使用 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 后程序仍然运行相同。

4

2 回答 2

1

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

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

这部分内容来自:http: //msdn.microsoft.com/en-us/library/ms228048%28v=vs.85%29.aspx

于 2013-06-03T15:48:31.473 回答
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,那么您应该知道 if-null 测试不是为了分配的利益,而是为了设置文本框文本的行. 使用代码中存在的 IF 块,我们可以保证当我们开始使用 ViewState["clicks"].ToString() 时,我们不会尝试在 null 上调用 ToString()(因为 ViewState["clicks"]已在别处设置或已被此 IF 块默认)

单击按钮 2 后它是回发,在我多次单击按钮 1 后程序仍然运行相同

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

于 2013-06-03T16:00:35.013 回答