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

由于某种我不明白的原因,即使它从未访问过该方法,changed当它到达该方法时也是如此,这是我的代码中唯一设置为真的地方。btnSave_clickdropdownlist_selectedIndexChangedchanged

标记:

<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

2 回答 2

8

您确定要使用在所有请求static中共享的字段变量吗?所以当 UserA 在 DropDown 中选择某些东西时,UserB 也会有= true。_changed

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

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

在 ASP.NET 应用程序中管理持久用户状态的九个选项

于 2013-03-05T16:53:39.167 回答
1

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

此外,正如其他人所提到的,static成员存储请求变量是一个好主意。ViewState更适合这个。

更新

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

这不是真的。

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

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

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

尽管如此,即使这样做,myDropDownList_SelectedIndexChanged事件也不会被触发,直到通过与网页交互来更改所选项目。

于 2013-03-05T16:54:45.760 回答