5

我有一个名为 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。为什么会发生这种情况?

4

1 回答 1

21

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

在视图状态中设置

ViewState["CheckBoxAvtivated"] = "true";

从视图状态获取

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

了解如何使用视图状态以及不应该使用它的位置很重要。

视图状态的作用

视图状态在生活中的目的很简单:它可以在回发中保持状态。(对于 ASP.NET 网页,其状态是构成其控件层次结构的控件的属性值。)这就引出了一个问题,“需要保持哪种状态?” 为了回答这个问题,让我们首先看看哪些状态不需要在回发中持久化。回想一下,在页面生命周期的实例化阶段,会创建控件层次结构并分配声明性语法中指定的那些属性。由于在构造控件层次结构时,这些声明性属性会在每次回发时自动重新分配,因此无需将这些属性值存储在视图状态中。

无状态协议

在计算中,无状态协议是一种通信协议,它将每个请求视为与任何先前请求无关的独立事务,因此通信由独立的请求和响应对组成。无状态协议不要求服务器在多个请求期间保留有关每个通信伙伴的会话信息或状态。相反,需要保持内部状态的协议称为有状态协议。要了解更多关于少状态的信息,请参阅此维基百科文章

于 2013-01-31T06:07:09.643 回答