布尔变量的奇怪行为,变量的值在回发之间丢失

时间:2013-01-31 06:05:43

标签: c# asp.net visual-studio-2008

我有一个名为CheckBoxActivated的布尔变量,我在验证用户名和密码后将其赋值为true。

string name = us.UserName;
string password = us.Password;

if (name.Equals(txtName.Text) && (password.Equals(txtPassword.Text)))
{
    CheckBoxAvtivated = true;

奇怪的是,在对变量进行“真实”分析后,我点击另一个按钮,然后立即变为“假”,这会导致不良行为。

protected void butNext_Click(object sender, EventArgs e)
{
    if (CheckBoxAvtivated)
    {
        pnlCheckBoxes.Visible = true;
        pnlUserCheckBoxValidation.Visible = false;
    }
    else
    {
        pnlCheckBoxes.Visible = false;
        pnlUserCheckBoxValidation.Visible = true;
    }

变量的状态因此意外变为false。这可能发生的原因是什么?

1 个答案:

答案 0 :(得分:20)

如果要在回发之间保持状态,asp.net中的类级别变量(全局变量)不会在回发之间保持状态,必须使用viewstate。 Asp.net基于http协议是无状态协议,并且不提供在请求之间存储用户数据的方法

在viewstate中设置

ViewState["CheckBoxAvtivated"] = "true";

从viewstate获取

bool CheckBoxAvtivated = bool.Parse(ViewState["CheckBoxAvtivated"].ToString());

学习使用viewstate以及不应该使用它的位置非常重要。

视图状态的角色

  

查看国家生活的目的很简单:它是坚持国家的目的   跨回发。 (对于ASP.NET网页,其状态是属性   构成其控制层次结构的控件的值。)这个问题   问题是,“需要坚持哪种状态?”回答   那个问题,让我们先来看看哪个州不需要   坚持回发。回想一下,在实例化阶段   页面生命周期,控件层次结构和那些   已分配声明性语法中指定的属性。   由于这些声明性属性会自动重新分配   构建控件层次结构时的每个回发,都没有   需要在视图状态中存储这些属性值。你可以阅读   有关viewstate here的更多信息。

无状态协议

  

在计算中,无状态协议是一种通信协议   将每个请求视为与之无关的独立事务   任何先前的请求,以便通信包括独立的   一对请求和响应。无状态协议不需要   服务器保留会话信息或每个的状态   通信伙伴在多个请求期间。在   相反,需要保持内部状态的协议是   称为有状态协议。要阅读更多关于国家的信息,请看这个   维基百科article