静态布尔值始终为真

3

我有一个类似于这样的Web表单应用程序。

public partial class MyPage : Page
{
    private static bool _changed = false;

    protected void btnSave_Click(object sender, EventArgs e)
    {
         if(_changed)
         {
             //some code here
         }
    }

    protected void btnCancel_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/MyPage.aspx");
    }

    protected void dropdownlist_SelectedIndexChanged(object sender, EventArgs e)
    {
        _changed = true;  
    }
}

我试图做的事情是,有一个表单,其中包含一个下拉列表和一个保存按钮。如果用户更改下拉列表中的选项,我会将私有布尔值 changed 设置为 true。默认情况下,它为 false。

出于我不理解的某种原因,在到达 btnSave_click 方法时,changed 为 true,尽管它从未访问过 dropdownlist_selectedIndexChanged 方法,这是我代码中唯一将 changed 设置为 true 的地方。

标记:

<asp:DropDownList ID="myDropDown" runat=server" OnSelectedIndexChanged="dropdownlist_SelectedIndexChanged" AutoPostBack="true">
<asp:ListItem Value="True">Yes</asp:ListItem>
<asp:ListItem Value="False">No</asp:ListItem>

<asp:Button ID="btnSave" Text="Save" OnClick="btnSave_Click" runat="server" />

4
请记住,静态变量将保留其值,直到应用程序池回收或该值被重置。同时请注意,除非您希望单个用户更改所有用户的值,否则静态成员绝对是错误的选择。 - Tim M.
3
静态内容是所有用户共享的,如果两个人同时访问网站,其中一个人可能会触发更改,这将影响到他们两个人。 - Lasse V. Karlsen
2个回答

8

您确定要使用一个在所有请求中共享的static字段变量吗?因此,当用户A在下拉列表中选择某些内容时,用户B也将具有_changed= true。

您可能想改用ViewStateSession变量,例如:

private bool HasChanged
{
    get { object b = ViewState["HasChanged"] ?? false; return (bool)b; }
    set { ViewState["HasChanged"] = value; }
}

在ASP.NET应用程序中管理持久用户状态的九种方法


1

我认为 SelectedIndexChanged 是由 <select> 元素得到初始值时触发的。这意味着在表单初始化之前,甚至是用户不能与其进行交互之前,dropdownlist_SelectedIndexChanged() 方法就会被调用。您可以使用调试器来查看此方法何时被执行。

另外,正如其他人所提到的,static 成员不是存储请求变量的好方法;ViewState 更适合此目的。

更新

我认为 SelectedIndexChanged 是由 <select> 元素得到初始值时触发的。

这不是真的。

我通过一个非常简单的 web 应用程序测试了一下,发现当通过声明文件 (MyPage.aspx) 向 DropDownList 添加初始值时,SelectedIndexChanged 事件并不会触发。

我甚至尝试在代码后端以编程方式更改 SelectedIndex

protected void Page_Load(object sender, EventArgs e)
{
    myDropDownList.Items.Add(new ListItem("Text", "Value"));
    myDropDownList.SelectedIndex = 2;
}

即使这样做,myDropDownList_SelectedIndexChanged 事件也不会在通过与网页交互来更改所选项目之前触发。

1
我找不到任何支持我的说法的文档:“我认为SelectedIndexChanged是由<select>元素填充其初始值而触发的。” 有人知道这是真的还是假的吗? 我会在有空的时候进行实验以确认或证明这一点... - Jesse Webb
我知道在许多情况下这并不是真的,但是考虑到某些事件序列,我不能百分之百地说它从来没有发生过。 - Tim M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接