【问题标题】:Prevent ASP.net __doPostback() from jQuery submit() within UpdatePanel防止 ASP.net __doPostback() 来自 UpdatePanel 中的 jQuery submit()
【发布时间】:2011-01-26 07:54:36
【问题描述】:

如果我的自定义 jQuery 验证返回 false,我正在尝试停止表单提交的回发。

有什么方法可以防止 __doPostback() 函数在 submit() 函数中完成?

我假设:

$('#aspnetForm').submit(function () { return false; });

可以解决问题,但显然情况并非如此:有人有建议吗?

submit() 函数确实会阻止回发(如果您在 firebug 的断点处暂停,它不会回发),但在 submit() 函数完成后,我似乎无法阻止事件发生!

干杯,埃德

编辑

好的,我很快就搞砸了,发现我用来导致回发的按钮作为 asyncpostbacktrigger 绑定到更新面板的事实似乎是问题所在:如果我将其作为触发器删除(即导致它产生一个完整的回发),阻止返回 false 的回发是没有问题的;

知道为什么异步回发无法使用 return false 停止吗?

【问题讨论】:

    标签: asp.net jquery forms asp.net-ajax updatepanel


    【解决方案1】:

    您必须使用客户端 PageRequestManager 才能正确处理 AJAX 提交事件。 (例如,防止异步回发。)

    如果您无法完全控制页面,则页面上的 JavaScript 可能只调用 __doPostBack() 而无需经过任何页面逻辑。 在这种情况下 - 除了上述情况 - 您必须存储旧的 window.__doPostBack() 并提供自己的 - 正如@tucaz 在他的 cmets 中提到的那样。 (...正如您所提到的,链接可能会变得非常令人困惑。) 对于常规提交(非 AJAX),您可以像其他人指出的那样提供事件处理程序。

    This page 可能会有所帮助,并且有一些使用PageRequestManager 的代码示例。特别是:

    initialize : function()
    {
        ...
    
        this._onSubmitHandler = Function.createDelegate(this, this._onSubmit);
        this._onPartialUpdateEnd = Function.createDelegate(this, this._onUpdateEnd);
    
        if (typeof(Sys.WebForms)!== "undefined" && typeof(Sys.WebForms.PageRequestManager)!== "undefined")
        {
            Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, this._onSubmitHandler);
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._onPartialUpdateEnd);
        }
        else 
            $addHandler(document.forms[0], "submit", this._onSubmitHandler);
    },
    

    编辑: 继上述之后,这对我来说例如工作正常(.Net 3.5 SP1,Button1 在更新面板中触发,等等...):

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    
        <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js" charset="utf-8"
            type="text/javascript"></script>
    
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <div>
                    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                </div>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" />
            </Triggers>
        </asp:UpdatePanel>
        </form>
        <script type="text/javascript">
            (function($, undefined) {
    
                var submitHandler = function(e) {
                    return false;
                }
    
                if (typeof (Sys.WebForms) !== "undefined" && typeof (Sys.WebForms.PageRequestManager) !== "undefined") {
                    Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, submitHandler);
                } else {
                    $("form").submit(submitHandler);
                }
            })(jQuery);
        </script>
    </body>
    </html>
    

    【讨论】:

    • 是的,我浏览过 UpdatePanel 文档,看来您可以使用 PageRequestManager.getInstance().abortPostBack() 取消异步回发。但是,这似乎无法正常工作:我的 submit() 处理程序不再阻止回发。
    • @Ed Woodcock:通过查看找到的来源和文章,例如在msdn.microsoft.com/en-us/magazine/cc163380.aspx 上,abortPostBack() 用于取消已已经开始的请求。
    【解决方案2】:
    $('#yourPostButton').click(function(){  
        return false; 
    });
    

    应该这样做!

    【讨论】:

    • 是的,但是我需要将它附加到表单上的每个按钮上,这不是很明智。我需要能够使用 submit() (或类似的)来完成它,这样我就可以使用利用代码的控件,而不必逐页配置它。
    • 如果这对您来说不是问题,您可以使用 $('input[type=button]') 或类似的东西将它添加到每个按钮,或者按照 jQuery 文档的建议尝试 .preventDefault()这里api.jquery.com/submit
    • 如果你想中断回发,另一个想法是获取原始 __doPostBack 函数的引用并用一些虚拟函数替换它。像这样的东西: var __oldPostBack = __doPostBack; __doPostBack = function() { //检查是否可以发帖,然后调用 __oldPostBack() }
    • 是的,选择器确实如此,但在 ASP.net 中,任何事情都可能导致回发,例如 dropdownlist selectedindexchanged(我们经常使用的一个),所以我必须根据情况绑定各种事件关于输入类型,这有点过于复杂了。至于 preventDefault(), return false 无论如何都会自动调用它,你可以看到你是否使用 firebug 逐步完成返回。
    • 链接 __doPostBack 如果您尝试多次执行此操作会出现一些问题,这意味着当需要多个控件向 __doPostback 添加功能时,它会变得非常复杂
    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多