我有一个ASP DropDownList控件,AutoPostBack属性设置为true。当用户更改选择时,表单将按预期回发。我想知道如何在代码隐藏中确定页面是否因特定原因而回发。
<小时/> 我知道我可以像这样定义一个事件处理程序......
protected void MyDropDownList_SelectedIndexChanged(object sender, EventArgs e) {
// Run some code if the selection for the "MyDropDownList" control was changed
}
...但我想知道的是如何检查表单是否回发,因为所选索引在事件处理程序之外被更改。
具体来说,在 Page_Load()方法中,我有一个if (IsPostback) {}
部分,如果回发是由此引起的,我希望此部分不执行更改DropDownList中的选择。所以,在伪代码中,我想要类似的东西:
if (IsPostback && (! <DropDownList's selection was changed, causing an autopostback>)) {
我尝试在事件处理程序中定义一个全局布尔变量并将其设置为 true ,然后在 Page_Load()中进行检查,如下所示:
public partial class MyWebApp : System.Web.UI.Page {
[...]
static bool selectedIndexChanged = false;
[...]
protected void DomainDropDownList_SelectedIndexChanged(object sender, EventArgs e) {
selectedIndexChanged = true; // Set this flag to true if selected index was changed
}
[...]
protected void Page_Load(object sender, EventArgs e) {
[...]
if (IsPostBack && selectedIndexChanged == false) {
[...]
}
[...]
由于我认为有经验的ASP.NET开发人员很容易发现:事件处理程序在 Page_Load()之后执行,无论代码的顺序如何,这都不起作用。
我还试图查看控件的 selectedIndexChanged 事件是否可以用作布尔条件,以确定是否触发了事件,如此
if (IsPostBack && !MyDropDownList.SelectedIndexChanged) {
但Visual Studio给出了以下错误:
事件&#39; System.Web.UI.WebControls.ListControl.SelectedIndexChanged&#39;只能出现在+ =或 - =&#34;
的左侧
对错误消息的搜索导致this answer,但这似乎没有帮助,因为它依赖于在 Page_Load()之后执行的事件处理程序。 / p>
在我的特定用例中,只有一个DropDownList和另一种提交表单的方式(提交按钮),检查所选索引是否已更改,是否触发了AutoPostBack同样有效,或者是否单击了提交按钮,但我也想知道如何在更广泛的场景中执行此操作,例如,如果有多个AutoPostBack控件和/或多种方式提交除AutoPostBack之外的表单。
<小时/>
所以,我的问题分解如下(虽然其中一些可能基本上是同一个问题,取决于答案是什么):
如果有更好的方法来实现我在这个特定情况下想要完成的事情,我可以接受建议,但我仍然想知道答案(s )到上面。
答案 0 :(得分:6)
在Page_Load
检查Page.Request.Form["__EVENTTARGET"]
期间。这将包含一个标识符,表示导致回发的控件。通过此,您应该能够确定回发是否是由您感兴趣的控件引起的。
if (IsPostBack && Request.Form["__EVENTTARGET"] != "<control ID>") {
...
}
是否可以检查Page_Load()方法或在SelectedIndexChanged事件处理程序之前执行的任何其他代码是否已更改DropDownList的选定索引?
不依赖于自定义技术。 SelectedIndexChanged
事件在page event lifecycle期间触发太晚,对您的方案有用。一种选择是在DropDownList.SelectedIndex
期间将Page.ViewState
存储到Page.OnPreRender
集合中,然后在DropDownList.SelectedIndex
期间将此值与帖子后面的新Page_Load
进行比较。