防止 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
__doPostBack方法解析 __VIEWSTATE __EVENTTARGET __doPostBack __EVENTARGUMENT