Asp.NET MVC AjaxOptions OnSuccess срабатывает .. слишком рано? - PullRequest
11 голосов
/ 29 июля 2009

Я хотел бы использовать параметр OnSuccess AjaxOptions, переданный в качестве аргумента Ajax.BeginForm, чтобы «сделать что-то» после того, как ответ полностью получен и DOM обновлен. Насколько я могу понять от MSDN, это то, что делает этот параметр.

В моем приложении сценарий OnSuccess срабатывает слишком рано, сразу после отправки запроса. Я уложил ветку на некоторое время, чтобы лучше увидеть результат. Я предполагал, что сценарий OnSuccess (предупреждение) будет запущен после этого времени ожидания, скажем, 2 секунды. Я использую Firebug, чтобы увидеть, что происходит под капотом, и все, что я вижу: я нажимаю кнопку (отправить внутри формы ajax), появляется предупреждение (за 2 секунды до ожидаемого), через 2 секунды firebug показывает запрос-ответ и ничего больше происходит.

Где я не прав?

Заранее спасибо, мт

Некоторый пример кода, как правильно было сказано (я запустил пустое новое решение, используя шаблон Asp.NET MVC в VS):

Главная / Указатель:

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<div id="divPlaceholder">
<% 
    using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() {
        UpdateTargetId = "divPlaceholder", 
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "alert('onsuccess fired')"
    })) 
{
%>
<input type="submit" value="button" />
<% } %>
</div>
</asp:Content>

HomeController

public ActionResult DoLongTask()
{
    if (Request.IsAjaxRequest())
    {
        System.Threading.Thread.Sleep(2000);
        return View();
    }
    else
    {
        throw new NotSupportedException();
    }
}

Я думаю, этого достаточно, чтобы воспроизвести поведение. Пустое частичное представление может использоваться как представление DoLongTask.

Ответы [ 5 ]

24 голосов
/ 04 ноября 2009

Не уверен, насколько это будет полезно, но я сейчас смотрю на что-то подобное и обнаружил, что если вы вызываете функцию в OnSucess, то это произойдет после метода действия, например:

using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() {
        UpdateTargetId = "divPlaceholder", 
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "function() { alert('onsuccess fired'); }"
    })) 
10 голосов
/ 01 августа 2009

Я пытался разобраться с этой проблемой, и кажется, что события «Вкл» не совсем такие, какими кажутся.

Если вы прочитаете этот пост Как измеряется OnSuccess для ASP.NET MVC ActionLink? вы увидите, что womp сообщает, что события могут запускаться независимо от того, что происходит в контроллере. Я также нашел это в тестах, которые я сделал, добавив все события «Вкл» к объекту AjaxOptions, например:

new AjaxOptions()
 {
     UpdateTargetId = "divPlaceholder",
     InsertionMode = InsertionMode.Replace,
     OnSuccess = "alert('OnSuccess')",
     OnBegin = "alert('OnBegin')",
     OnComplete = "alert('OnComplete')",
     OnFailure = "alert('OnFailure')"

 }

Я не использовал AjaxOptions ни в одном из написанных мной производственных кодов, но я добился большого успеха с вызовами jQuery Ajax и событиями, запускаемыми в правильное время.

Учебное пособие по ASP.net MVC и jQuery Ajax можно найти здесь , а некоторые примеры использования событий можно найти в коде этого вопроса

Извините, я не смог решить вашу проблему, но я надеюсь, что эта альтернатива поможет.

4 голосов
/ 22 ноября 2009

OnSuccess - это свойство, которое принимает имя функции или функции, как в вышеприведенном случае (без какого-либо определения). И AjaxOptions вызывает метод, для которого указано имя, после успеха, сбоя, ... Надеюсь, это поможет

1 голос
/ 31 июля 2011

Только что протестировал обратный вызов OnSuccess в MVC 3, и он, кажется, исправлен.

1 голос
/ 24 января 2011

Вызов функции Как

function showAlert () { оповещение («Hello World»); }

Позвоните в Ajax Begin

OnSuccess = "showAlert"

без скобок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...