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

时间:2009-02-05 20:00:56

标签: c# asp.net

我在类的顶部声明了一个布尔变量,当在页面上选择单选按钮时,变量设置为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;
   }
}

}   

7 个答案:

答案 0 :(得分:16)

重新加载页面时,会创建页面类的新实例,因此上次服务器交互中的任何值都将丢失。如果您希望将值保留在回发中,请将值放入viewstate:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

另外,我没有看到调用Send的位置。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

请注意,对您网页的每个请求都使用了一个全新的网页类实例。这包括回发。

答案 5 :(得分:1)

不要跳过你或任何东西......但为什么不检查是否

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

没有存储......没有用不需要的数据填充ViewState或Session ...

答案 6 :(得分:0)

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