Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态布尔总是正确的_C#_Asp.net - Fatal编程技术网

C# 静态布尔总是正确的

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 } }

我有一个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

出于某种我不理解的原因,
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%肯定地说,考虑到某些事件的顺序,这永远都是不正确的。