C# 为什么布尔变量总是重置为false;

C# 为什么布尔变量总是重置为false;,c#,asp.net,C#,Asp.net,我在类的顶部声明了一个布尔变量,当在页面上选择一个单选按钮时,该变量被设置为true,但当页面重新加载时,该变量被重置为false。我处理这个问题的一种方法是使用static关键字,但我不确定这是否是处理这个问题的最佳方法。下面是我在Page_Load事件中尝试执行操作的类,但它仍然将变量重置为false public class SendEmail { bool AllSelected; protected void Page_Load(object sender, EventArg

我在类的顶部声明了一个布尔变量,当在页面上选择一个单选按钮时,该变量被设置为true,但当页面重新加载时,该变量被重置为false。我处理这个问题的一种方法是使用static关键字,但我不确定这是否是处理这个问题的最佳方法。下面是我在Page_Load事件中尝试执行操作的类,但它仍然将变量重置为false

public class SendEmail
{
    bool AllSelected;

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        AllSelected = false;
    }
}

protected void rbAll_SelectedIndexChanged(object sender, EventArgs e)
{
    if(rbAll.SelectedValue == "All")
       AllSelected = true;
}

public Send()
{
   if(AllSelected)
   {
       //Send Email. Never runs because AllSelected is always false;
   }
}

}   

当重新加载页面时,将创建页面类的新实例,从而丢失上次服务器交互中的任何值。如果希望值在回发过程中保持不变,请将其置于viewstate中:

bool AllSelected
{
    get
    {
        object o = ViewState["AllSelected"];
        if(o == null) return false;
        return (bool)o;
    }
    set
    {
        ViewState["AllSelected"] = value;
    }
}

ViewState集合以隐藏元素的形式写入客户端浏览器的表单中,并在下次单击按钮或执行任何其他“回发”类型操作时回发和还原。

您的布尔值是一个实例变量,因此它将获得默认值(对于布尔值为false)每次创建类的新实例时

每次asp.net为页面提供服务时,它都会创建page类的新实例。这意味着AllSelected将始终自动初始化为false

public class SendEmail
{
    bool AllSelected;

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        AllSelected = false;
    }
}

protected void rbAll_SelectedIndexChanged(object sender, EventArgs e)
{
    if(rbAll.SelectedValue == "All")
       AllSelected = true;
}

public Send()
{
   if(AllSelected)
   {
       //Send Email. Never runs because AllSelected is always false;
   }
}

}   

我的建议是,除非有什么我在这里看不到的,从SelectedIndexChanged方法调用Send()。

记住,对页面的每个请求都使用一个全新的页面类实例。这包括回发

您需要存储变量。我建议将其存储在ViewState中,或者如果您想远离ViewState,请将其隐藏在页面上的表单元素中


另外,我看不到Send在哪里被调用。

不要跳到你身上或其他什么东西上……但为什么不检查一下

rbAll.SelectedValue == "All" 
在你的发送功能中


没有存储…没有用不需要的数据填充ViewState或会话…

我不知道这在asp.net中是否方便,但我在property.settings中创建了一个新的bool,以便在我关闭或重新启动应用程序时它会记住bool。但我认为这更适用于winforms。

我可以将布尔变量也设置为静态吗?如果将其设置为静态,则在所有请求中,包括多人访问页面时,它将只有一个值。所以这会变得非常难看。好吧,我想我需要阅读静态变量,它们仍然让我有点困惑,哈哈。谢谢。更具体地说,Xiasoft,您的静态变量每个ASP.NET工作进程将有一个值。一般来说,如果多人同时使用该页面(web页面很有可能),他们都会读写同一个变量的值,并且彼此重叠。这个类还有更多内容,我只是把它删掉。将它们声明为静态怎么样?这会引起什么问题吗?把它藏在表格里对我很有帮助+1即@Html.HiddenFor(model=>model.SelectedValue)(根据您的标准进行调整)我知道。还有一点。我删掉了很多代码以缩短它。