【问题标题】:Why is the boolean variable always resetting to false;为什么布尔变量总是重置为假;
【发布时间】:2009-02-05 20:00:55
【问题描述】:

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

}   

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    当页面重新加载时,会创建一个新的页面类实例,因此上次服务器交互的所有值都将丢失。如果您希望它在回发中持续存在,请将值放入视图状态:

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

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

    【讨论】:

    • 我可以将布尔变量也设置为静态吗?
    • 如果你把它设为静态,它在所有请求中只有一个值,包括当多人访问页面时。所以那会变得很丑。
    • 好的,我想我需要阅读静态变量,它们仍然让我感到困惑,哈哈。谢谢。
    • 更具体地说,Xiasoft,您的静态变量对于每个 ASP.NET 工作进程都有一个值。通常,如果多个人同时使用该页面(网页确实有可能),他们都会在彼此之上读取和写入同一个变量的值。
    【解决方案2】:

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

    我的建议是,除非我在这里看不到某些东西,否则只需从您的 SelectedIndexChanged 方法调用 Send()。

    【讨论】:

    • 这门课还有很多,我就删了。
    【解决方案3】:

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

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

    【讨论】:

    • 将它们声明为静态怎么样?这会导致任何问题吗?
    • 将其隐藏在表单中对我很有帮助。 +1 即 @Html.HiddenFor(model => model.SelectedValue )(根据您的标准进行调整)
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        不要跳到你或任何东西上......但为什么不检查一下

        rbAll.SelectedValue == "All" 
        

        在您的发送功能中?

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

        【讨论】:

        • 我知道。还有一点。为了简短起见,我删减了很多代码。
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2017-06-25
          • 2016-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多