在UpdatePanel中阻止ASP.net _udoPostBack()从jQuery提交()
如果自定义jQuery验证返回false,我将尝试停止表单提交上的回发 是否有任何方法可以防止_doPostback()函数在submit()函数中完成 我假设:在UpdatePanel中阻止ASP.net _udoPostBack()从jQuery提交(),asp.net,jquery,forms,asp.net-ajax,updatepanel,Asp.net,Jquery,Forms,Asp.net Ajax,Updatepanel,如果自定义jQuery验证返回false,我将尝试停止表单提交上的回发 是否有任何方法可以防止_doPostback()函数在submit()函数中完成 我假设: $('#aspnetForm').submit(function () { return false; }); 这会起作用,但显然不是这样:有人有建议吗 submit()函数确实会阻止回发(如果您在firebug中的断点处暂停,它将不会回发),但在submit()函数完成后,我似乎无法阻止事件发生 干杯,艾德 编辑 好吧,我很快就搞
$('#aspnetForm').submit(function () { return false; });
这会起作用,但显然不是这样:有人有建议吗
submit()函数确实会阻止回发(如果您在firebug中的断点处暂停,它将不会回发),但在submit()函数完成后,我似乎无法阻止事件发生
干杯,艾德
编辑
好吧,我很快就搞砸了,发现我用来导致回发的按钮作为asyncpostbacktrigger绑定到updatepanel上,这似乎是个问题:如果我将其作为触发器删除(即,使其生成完整的回发),则使用return false阻止回发没有问题
你知道为什么异步回发不能使用return false停止吗
$('#yourPostButton').click(function(){
return false;
});
这应该够了 您必须使用客户端来正确处理AJAX提交事件。(例如,防止异步回发。) 如果您不能完全控制页面,那么页面上可能有JavaScript只调用
\uuu doPostBack()
,而不经过任何页面逻辑。
在这种情况下,除了上述内容之外,您还必须存储旧的窗口。uu doPostBack()
,并提供您自己的窗口,如他在评论中提到的@tucaz。
(…正如您所提到的,链接可能会让人非常困惑。)
对于常规提交(非AJAX),您可以像其他人指出的那样提供事件处理程序
可能会有所帮助,并且有一些使用的代码示例。特别是:
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
是updatepanel中的触发器,等等):
(函数($,未定义){
var submitHandler=函数(e){
返回false;
}
if(typeof(Sys.WebForms)!=“未定义”&&typeof(Sys.WebForms.PageRequestManager)!=“未定义”){
add(Sys.WebForms.PageRequestManager.getInstance()。_onSubmitStatements,submitHandler);
}否则{
$(“表格”)。提交(提交人);
}
})(jQuery);
是的,但是我需要将其附加到表单上的每个按钮上,这不是很明智。我需要能够使用submit()(或其他等效工具)来完成此操作,这样我就可以使用使用代码的控件,而不必逐页进行配置。如果这对您来说不是问题,您可以使用$('input[type=button]”或类似的工具将其添加到每个按钮,或者尝试使用.preventDefault()正如jQuery文档所建议的那样,这里的另一个想法是获取一个对原始uu doPostBack函数的引用,如果您想中断回发,则将其替换为一些伪函数。类似这样的东西:var uu oldPostBack=uu doPostBack__doPostBack=function(){//检查是否可以post,然后调用_oldPostBack()}是的,选择器为true,但在ASP.net中,任何东西都可能导致回发,例如dropdownlist selectedindexchanged(我们经常使用的一个),因此我必须根据输入类型绑定各种事件,这有点过于复杂。对于preventDefault(),return false会自动调用此函数,正如您可以看到的那样,如果您多次尝试使用firebug.chaining\u doPostBack进行返回,则会出现一些问题,这意味着当需要多个控件向\u doPostbackYes添加功能时,会变得非常复杂,我已经阅读了UpdatePanel文档,似乎可以使用PageRequestManager.getInstance().abortPostBack()取消异步回发。但是,这似乎无法正常工作:my submit()处理程序不再阻止回发。@Ed Woodcock:通过查看源代码和找到的文章(例如on),abortPostBack()用于取消已启动的请求。
<%@ 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>