防止 ASP.net __doPostback() 来自 UpdatePanel 中的 jQuery submit()

Posted

技术标签:

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

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

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

我假设:

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

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

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

干杯,埃德

编辑

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

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

【问题讨论】:

【参考方案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 添加功能时,它会变得非常复杂

以上是关于防止 ASP.net __doPostback() 来自 UpdatePanel 中的 jQuery submit()的主要内容,如果未能解决你的问题,请参考以下文章

asp.net爬虫asp.NET分页控件抓取第n页数据 javascript:__doPostBack

IE10 SCRIPT5009:“__doPostBack”未定义

在 JQuery 对话框文本框中输入单击不会触发 __doPostBack

asp.net js调用后台方法

使用 JavaScript 的 ASP.NET 回发

__doPostBack方法解析 __VIEWSTATE __EVENTTARGET __doPostBack __EVENTARGUMENT