我有一个看起来像这样的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" />
答案 0 :(得分:8)
您确定要使用在所有请求之间共享的static
字段变量吗?因此,当UserA在DropDown中选择某些内容时,UserB也将具有_changed
= true。
您可能希望使用ViewState
或Session
变量,例如:
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
事件也不会被触发。