静态布尔总是如此

时间:2013-03-05 16:48:44

标签: c# asp.net

我有一个看起来像这样的webform应用程序。

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。默认情况下,它是错误的。

由于某些我不理解的原因,changed在到达btnSave_clic k方法时是正确的,即使它从未访问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" />

2 个答案:

答案 0 :(得分:8)

您确定要使用在所有请求之间共享的static字段变量吗?因此,当UserA在DropDown中选择某些内容时,UserB也将具有_changed = true。

您可能希望使用ViewStateSession变量,例如:

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

Nine Options for Managing Persistent User State in Your ASP.NET Application

答案 1 :(得分:1)

我认为SelectedIndexChanged<select>元素触发,并填充了它的初始值。这意味着在您的表单初始化时,在用户甚至可以与其进行交互之前,您的dropdownlist_SelectedIndexChanged()方法正在被调用。您可以使用调试器来查看此方法的执行时间。

另外,正如其他人所提到的,static成员最好存储请求变量; ViewState更适合这种情况。

更新

  

我认为SelectedIndexChanged会被<select>元素触发,并填充初始值。

事实并非如此。

我使用一个非常简单的网络应用程序对此进行了测试,并且当通过声明性文件(MyPage.aspx)将初始值添加到SelectedIndexChanged时,DropDownList事件不会被触发。< / p>

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

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

尽管如此,即使执行此操作,在通过与网页交互更改所选项目之前,myDropDownList_SelectedIndexChanged事件也不会被触发。