C# 静态布尔总是正确的
我有一个web表单应用程序,看起来像这样C# 静态布尔总是正确的,c#,asp.net,C#,Asp.net,我有一个web表单应用程序,看起来像这样 public partial class MyPage : Page { private static bool _changed = false; protected void btnSave_Click(object sender, EventArgs e) { if(_changed) { //some code here } }
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
出于某种我不理解的原因,changed
在到达btnSave\u click
方法时为真,尽管它从未访问过dropdownlist\u 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" />
您真的确定要使用在所有请求中共享的静态
字段变量吗?因此,当UserA在下拉列表中选择某个内容时,UserB也将改变\u
=true
您可能希望改用ViewState
或Session
变量,例如:
private bool HasChanged
{
get { object b = ViewState["HasChanged"] ?? false; return (bool)b; }
set { ViewState["HasChanged"] = value; }
}
我认为SelectedIndexChanged
是由
元素的初始值填充而触发的。这意味着在初始化表单时,在用户可以与表单交互之前,将调用dropdownlist\u SelectedIndexChanged()
方法。您可以通过使用调试器查看何时执行此方法来验证这一点
另外,正如其他人所提到的,静态
成员是存储请求变量的好主意<代码>视图状态
更适合于此
更新
我认为
SelectedIndexChanged
被
元素的初始值填充触发
事实并非如此
我用一个非常简单的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\u SelectedIndexChanged
事件在通过与网页交互更改所选项目之前不会触发。请记住,静态变量将保留其值,直到应用程序池回收或以其他方式重置该值。还请记住,除非您希望单个用户更改所有用户的值,否则静态成员绝对是错误的选择。静态是为所有用户共享的,如果您有两个人同时访问该站点,其中一人可能会触发更改,从而影响他们两人。我找不到任何文档支持我的声明“我认为SelectedIndexChanged是由使用初始值填充的元素触发的。“有人知道这是真是假吗?当我有空闲时间来证实或反驳这一点时,我会进行实验……我知道在很多情况下这是不正确的,但我不能100%肯定地说,考虑到某些事件的顺序,这永远都是不正确的。