2009-02-05 57 views
3

我有一个布尔变量声明在一个类的顶部,并且当一个单选按钮被选中时,该变量被设置为true,但是当页面被重新加载时,该变量被重置为false。我处理这个的一种方法是使用static关键字,但我不确定这是否是处理此问题的最佳方法。以下是我在Page_Load事件中尝试做的事情的类,但它仍然将变量重置为false。为什么布尔变量总是重置为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; 
    } 
} 

} 

回答

16

当页面重新加载时,会创建页面类的新实例,以避免上次服务器交互的任何值丢失。把值到视图状态,如果你希望它在回发坚持:

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

ViewState的集合是写在一个隐藏的元素到客户端浏览器的形式,并回传,以及恢复下一次他们点击一个按钮或者做任何其他“回传”类型的操作。

+0

我可以设置布尔变量为静态吗? – Xaisoft 2009-02-05 20:05:45

+0

如果您将其设置为静态,则它将只在所有请求中具有一个值,包括多人访问该页面时。所以这会变得非常难看。 – 2009-02-05 20:08:57

+0

好吧,我想我需要阅读静态变量,他们仍然有点困惑,哈哈。谢谢。 – Xaisoft 2009-02-05 20:10:13

1

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

2

每当asp.net提供一个页面,它就会创建一个新的页面实例。这意味着AllSelected将始终被自动初始化为false。

我的建议,除非我在这里没有看到的东西,只是从你的SelectedIndexChanged方法调用Send()。

1

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

2

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

此外,我没有看到发送被调用的地方。

1

不要妄下你或任何东西......但为什么不只是检查是否

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

没有存储......没有填充ViewState中或会话的数据是不需要......

0

我真的不知道这将是在asp.net方便,但我创建了一个property.settings中的新布尔值,以便在关闭或重新启动应用程序时记住布尔值。但我认为这是更多的WinForms。