【问题标题】:JavaScript: Determine which control caused postbackJavaScript:确定哪个控件导致回发
【发布时间】:2011-04-08 12:03:16
【问题描述】:

我目前正在使用 ASP.NET 3.5 开发一个网站。在页面上,有些情况下我不希望特定控件会导致回发到服务器。如果满足该条件,我编写了一个返回 false 的函数,该函数将在 onsubmit-Event 发生时调用。但不知何故,我需要确定哪个控件会导致回发,因为只有当这个特定控件在某些条件下导致回发时,才应该取消回发。怎么可能做到这一点?

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript asp.net onclick postback submit


    【解决方案1】:

    见:

    ASP.NET如何识别控件 负责处理回发? 当在 请求主体实现 IPostBackEventHandler接口,该 页面类查找__EVENTTARGET 隐藏字段,如果有的话。的内容 该字段假定为ID 导致回发的控件。 如果此控件实现 IPostBackEventHandler接口,该 RaisePostbackEvent 方法被调用。

    来自这里 - The Client Side of ASP.NET Pages

    所以在客户端__EVENTTARGET 就是您所需要的。在服务器端,您可以覆盖 Page.RaisePostBackEvent 方法(这是受保护的方法,因此您可以从 System.Web.UI.Page 类继承):

    protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, 
                                               string eventArgument)
    {
        // sourceControl is a control that caused postback
        base.RaisePostBackEvent(sourceControl, eventArgument);
    }
    

    或在不继承的情况下执行相同的操作:

    var controlName = page.Request.Params["__EVENTTARGET"];
    Control postbackControl = null;
    if (!string.IsnullOrEmpty(controlName))
    {
        postbackControl = this.Page.FindControl(controlName);
    }
    

    编辑:关于作者对我的回答的评论:如果__EVENTTARGET 值是一个空字符串,那么您似乎在__doPostBack 函数中设置它之前就获得了这个值。因此,解决方法可能是 覆盖 __doPostBack 函数或类似方式;你可以在 SO quesion 中找到一个例子。

    【讨论】:

    • 您好,在服务器端查询导致回发的控件为时已晚,因为我想阻止回发。所以我试图获取处理事件 onsubmit 的隐藏字段 __EVENTTARGET 的值,但它的值始终是一个空字符串。
    • 谢谢。您提供的链接对我帮助很大:)
    【解决方案2】:

    您可以使用ScriptManager.GetCurrent().AsyncPostBackSourceElementID 来查找导致回发到页面的控件。

    有关MSDN 的更多详细信息,但它适用于这些情况:

    • 来自控件的回发 在 UpdatePanel 控件中,其 ChildrenAsTriggers 属性设置为 true(默认)。

    • 来自作为 UpdatePanel 控件触发器的控件的回发。

    • 来自通过调用 RegisterAsyncPostBackControl 方法 ScriptManager 控件。

    我不知道您是否在使用 UpdatePanels,但这似乎是我能想到的唯一一种情况,您需要知道哪个控件导致回发。

    【讨论】:

    • 您好,我不使用更新面板。我的情况是我的页面上有一个 DropDownList 。每次选择另一个项目时,都会导致回发。如果选择了列表中的第一个值,我想阻止该回发,因为它是无效条目(仅供参考)并且如果选择了一个值但相关信息已显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多