为什么我不能像其他变量一样初始化ViewState变量?

时间:2014-05-20 22:18:26

标签: c# asp.net variables viewstate

我在asp.net c#中使用ViewSate变量测试了一些代码。

我尝试初始化一个ViewState变量,显然编译器出错了,请给我一个错误的理论解释。

public partial class _Default : System.Web.UI.Page
{
    int value = 0;
    ViewState["vsValue"]=value;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack==false)
        {
            Label1.Text = value.ToString();
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        ViewState["vsValue2"]=value;
        value++;
        Label1.Text = value.ToString();
    }
}

enter image description here

4 个答案:

答案 0 :(得分:1)

您只能将变量的定义放在类范围内。任何其他代码(如在您的情况下初始化数组/字典元素)都需要在方法或构造函数内。

最有可能与你要做的事情相同的是向Page_Load添加初始化(因为构造函数可能在页面的生命周期中过早)

protected void Page_Load(object sender, EventArgs e)
{
    ViewState["vsValue"]=value;
    if (IsPostBack==false)
    {
        Label1.Text = value.ToString();
    }
}

对于常规类,这样的代码将转到构造函数:

class Foo
{
   Dictionary<string,string> map = new Dictionary<string,string>();

   public Foo()
   {
      map["One"] = "1";
   }

答案 1 :(得分:0)

在您的代码中,您没有初始化ViewState变量,而是将值放在包含ViewState的字典中。这些是不同的行为。

如果你打算分配ViewState,它会看起来像

 ViewState = new Dictionary<>;

除了类型和通用表达式中的错误之外,可能不允许这样做,因为ViewState属性setter很可能是私有的。

但您正在使用索引器使用键&#34; vsValue&#34;设置键/值对的值。这根本不是有效的c#。

如果您能够为ViewState分配任何内容,则可以使用字典初始化,如

  ViewState = new Dictionary <string, object>
        {{"vsValue", 1}, {"vsValue2", 2}};

答案 2 :(得分:0)

我想您之所以这样做是因为您希望将其声明为变量一次并在整个页面的方法中使用它。您可以通过将ViewState设置为页面上的属性来实现此目的,如下所示:

    private string MyValue
    {
        get { return (string)(ViewState["vsValue"] ?? (object)null); }
        set { ViewState["vsValue"] = value; }
    }

//as an example you may have two click event buttons as below

protected void Button1_Click(object sender, EventArgs e)
{
    MyValue = "value1";
    value++;
    Label1.Text = value.ToString();
}

protected void Button2_Click(object sender, EventArgs e)
{
    Label2.Text = MyValue; //e.g. set the previous value first

    MyValue = "value2"; //e.g. change this value now

    ...
}

答案 3 :(得分:-1)

您所谓的变量不是变量。

ViewState是一个特殊字典,可供页面使用。当您在页面中引用ViewState时,实际上是指Page.ViewState

可以使用索引器访问ViewState中的个别条目:

ViewState["MyInteger"] = 123;
int myInteger = (int) ViewState["MyInteger"];

这不是一个变量,不仅仅是&#34;会话变量&#34;是变量:

Session["MyInteger"] = 123;
int myInteger = (int) Session["MyInteger"];

就像.NET中的任何其他地方一样,赋值语句只能在方法或属性中使用 - 它不能用作声明。