Предотвращение ASP.net __doPostback () от jQuery submit () в UpdatePanel - PullRequest
5 голосов
/ 11 марта 2010

Я пытаюсь остановить постбэк при отправке формы, если моя пользовательская проверка jQuery возвращает false.

Есть ли способ предотвратить завершение функции __doPostback () из функции submit ()?

Я предположил:

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

сработает, но, видимо, дело не в этом: у кого-нибудь есть предложение?

Функция submit () блокирует обратную передачу (она не будет отправляться, если вы сделаете паузу в точке останова в firebug), но я не могу остановить событие, происходящее после завершения функции submit ()!

Cheers, Ed

EDIT

ОК, у меня был небольшой беспорядок, и я обнаружил, что проблема в том, что кнопка, которую я использую для обратной передачи, связана с панелью обновления в качестве asyncpostbacktrigger, кажется, является проблемой: если я удаляю ее как триггер (т.е. заставить его выполнить полную обратную передачу), нет проблем с предотвращением обратной передачи с возвратом false;

Есть идеи, почему асинхронная обратная передача не может быть остановлена ​​с использованием return false?

Ответы [ 2 ]

5 голосов
/ 11 марта 2010

Вы должны использовать клиентскую сторону PageRequestManager для правильной обработки событий отправки AJAX. (например, предотвратить асинхронную обратную передачу.)

Если вы не полностью контролируете страницу, на странице может быть JavaScript, который просто вызывает __doPostBack() без прохождения логики страницы. В этом случае - в дополнение к вышесказанному - вы должны сохранить старый window.__doPostBack() и предоставить свой собственный - как @tucaz упомянул в своих комментариях. (... и, как вы упомянули, это может вызвать недоумение из-за цепочки.) Для регулярных отправок (не AJAX) вы можете предоставить обработчик событий, как указали другие.

Эта страница может быть полезна и содержит несколько примеров кода, которые используют 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>
3 голосов
/ 11 марта 2010
$('#yourPostButton').click(function(){  
    return false; 
});

Это должно сделать!

...