2013-03-05 90 views
2

我有一个看起来像这样的webform应用程序。static bool始终为真

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是真实不虚。

的标记:

<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

请记住,一个静态变量将保持其值,直到应用程序池回收或值被重置。另外请记住,除非您希望单个用户更改所有用户的值,否则静态成员绝对是错误的选择。 – 2013-03-05 16:52:35

+3

如果您有两个人同时访问该网站,则所有用户都会共享静态,其中一个用户可能触发会影响他们的更改。 – 2013-03-05 16:52:40

回答

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

我认为SelectedIndexChanged得到由<select>元素触发得到填充它的初始值。这意味着当你的表单正在初始化时,在用户甚至可以与之交互之前,你的方法正在被调用。您可以使用调试器来验证此方法是否正在执行。

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

UPDATE

我认为SelectedIndexChanged得到由<select>元素触发得到填充它的初始值。

这是不正确的。

我有一个非常简单的web应用程序测试了这一点,当初始值正在通过声明文件(MyPage.aspx)加入到DropDownListSelectedIndexChanged事件不会被解雇。

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

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

不过,这样做即使,在myDropDownList_SelectedIndexChanged事件不会被解雇,直到通过与网页交互改变所选择的项目。

+1

我找不到任何支持我声称“我认为SelectedIndexChanged被