2009-07-29 3 views
10

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

В моем приложении скрипт 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.

+2

post ... ваш ... код ....! – womp

+0

Код добавлен как (правильно) задан! – ccalboni

ответ

10

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

Если вы прочтете это сообщение How is OnSuccess measured for a 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 можно найти here и некоторые примеры того, как использовать события можно найти в коде на this question

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

+0

Спасибо, Webmonger, я новичок в MVC, но у меня есть некоторый опыт работы с Ajax через JQuery: я буду следовать вашему предложению, чтобы максимизировать этот опыт в среде MVC, насколько я могу разобраться, и эти миры могут хорошо жить вместе. – ccalboni

+0

Я запустил пару приложений asp.net mvc сейчас, и как я, так и мои разработчики находят jQuery и asp.net MVC отлично работают вместе. Есть много хороших примеров хорошей практики. http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx#jQuery – Webmonger

+1

См. ответ Пола Маккаски ... это правильный вариант. Это нормальное использование для jquery или javascript. Если вы сделаете то же самое в вызове события jquery, то произойдет то же самое. Вы должны дать ему имя функции или обернуть свой код с помощью функции() {} – Edyn

24

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

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

Формат 'function() {}' работал для меня, спасибо. – Maslow

+0

Да, это работает так, как ожидалось для меня. –

+0

работал для меня tooo :). Спасибо большое –

4

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

1

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

функции showAlert() { предупреждение ("Hello World"); }

Вызов в Ajax Начало

OnSuccess = "showAlert"

без скобок

1

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

Смежные вопросы