在事件处理程序以外的代码隐藏部分确定是否更改了选定的索引或触发了自动回退事件



我有一个ASP下拉列表控件,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) {}部分,如果回发是由更改下拉列表中的选择引起的,我希望该部分执行。因此,在伪代码中,我想要这样写:

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给我以下错误:

事件'System.Web.UI.WebControls.ListControl. 'SelectedIndexChanged'只能出现在+=或-="

的左侧

对错误消息的搜索导致了这个答案,但这似乎没有帮助,因为它依赖于事件处理程序,在Page_Load()之后执行。

特定用例中,只有一个,它只有一个方法提交表单(submit按钮),这将是同样有效的检查所选指标是否改变,是否将AutoPostBack触发,或是否提交按钮被点击了,但我还想知道如何做到这一点在更广泛的情况下,例如如果有多个将AutoPostBack控制和/或多种方式来提交表单将AutoPostBack。


所以,我的问题分解如下(尽管其中一些可能本质上是相同的问题,取决于答案是什么):

  • 是否有一种方法来确定在一般情况下是否触发了AutoPostBack,而不是表单张贴回任何其他原因,如点击一个按钮?
  • 是否有一种方法来确定是否触发了特定的控件的AutoPostBack(即,如果有多个控件与AutoPostBack为真,可以确定哪个控件导致AutoPostBack)?
  • 是否可以检查在Page_Load()方法或在SelectedIndexChanged事件处理程序之前执行的任何其他代码下拉列表的选定索引是否被更改?

如果有更好的方法来达到我在这个特殊情况下试图完成的目标,我愿意听取建议,但我仍然想知道上面的答案。

Page_Load检查Page.Request.Form["__EVENTTARGET"]时。这将包含一个标识符,表示引起回发的控件。由此,您应该能够确定回发是否是由您感兴趣的控件引起的。

if (IsPostBack && Request.Form["__EVENTTARGET"] != "<control ID>") {
    ...
}

是否有可能检查在Page_Load()方法或任何其他代码之前执行SelectedIndexChanged事件处理程序是否DropDownList的选择索引被更改?

不需要诉诸自定义技术。SelectedIndexChanged事件在页面事件生命周期中触发得太晚,对您的场景没有用处。一种选择是在Page.OnPreRender期间将DropDownList.SelectedIndex存储到Page.ViewState集合中,然后在Page_Load期间将此值与回发的新DropDownList.SelectedIndex进行比较。

最新更新