Подтвердить что ты не робот

Asp.NET MVC AjaxOptions OnSuccess срабатывает.. слишком рано?

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

В моем приложении OnSuccess script срабатывает слишком рано, сразу после отправки запроса. Я немного сплю нить, чтобы лучше видеть результат. Я должен был увидеть OnSuccess script (предупреждение), выпущенное после этого времени сна, скажем, 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.

4b9b3361

Ответ 1

Я искал эту проблему, и кажется, что события "On" не совсем то, что они кажутся.

Если вы прочтете это сообщение Как измеряется OnSuccess для ASP.NET MVC ActionLink?, вы увидите, что womp говорит, что события могут срабатывать независимо от того, что происходит в контроллер. Я также нашел это в тестах, которые я сделал, добавив все события "On" в объект 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 можно найти здесь, а некоторые примеры использования событий можно найти в коде на этот вопрос

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

Ответ 2

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

using (Ajax.BeginForm("DoLongTask", "Home", 
    new AjaxOptions() {
        UpdateTargetId = "divPlaceholder", 
        InsertionMode = InsertionMode.Replace,
        OnSuccess = "function() { alert('onsuccess fired'); }"
    })) 

Ответ 3

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

Ответ 4

Вызвать функцию Like

function showAlert() {  alert ( "Hello World" ); }

Вызов в Ajax Begin

OnSuccess = "showAlert"

без круглых скобок

Ответ 5

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