Как обновить div с помощью Ajax.BeginForm И выполнить функцию javascript?

Я обновляю div с частичным представлением, используя что-то вроде этого:

<% using (Ajax.BeginForm("Action", "Controller",
               new { id=Model.id },
               new AjaxOptions
               {
                   UpdateTargetId = "divId",
                   InsertionMode = InsertionMode.InsertAfter,
               }))
   {  %>

и он работает нормально, возвращенное представление добавляется к div, однако теперь мне нужно выполнить javascript, когда сообщение будет успешным, поэтому я подумал: «просто, просто добавьте OnSuccess = "MyJsFunc()"» в AjaxOptions, но после этого он остановился работающий! теперь страница обновляется, и отображается только возвращенное частичное представление :(, я даже пробовал с простым Alert("Hi"), и он не работает .. как я могу заставить это работать?

(кстати, я думаю, что это может быть дубликат https://stackoverflow.com/questions/1994754/execute-javascript-after-loading-a-mvc-page-using-ajax-beginrouteform, но этот вопрос был оставлен без ответа)


person Francisco Noriega    schedule 01.10.2010    source источник
comment
+1 по этому вопросу; Я полагаю, что сам видел такое же поведение; с использованием ASP.NET 4.0 с MVC2 и C #. Каждый раз, когда я добавляю значение члена OnSuccess в AjaxOptions, форма Ajax, кажется, превращается в обычную форму. Я только начал использовать jQuery.form для отправки таких форм, но я тоже хотел бы разобраться в этом!   -  person Andrew Barber    schedule 01.10.2010
comment
Хм, я также использую ASP.NET 4, MVC2 и C #.   -  person Francisco Noriega    schedule 01.10.2010
comment


Ответы (2)


Есть ли причина не делать это правильно (в конце концов, мы находимся в 2010 году)? Сбросьте MS AJAX туда, где он принадлежит, вместе со всеми Ajax.* помощниками, которые от него зависят, и напишите правильный код. Хотя использование MS AJAX в классических веб-формах могло быть оправдано из-за UpdatePanels и т. Д., Использование этого в новом приложении ASP.NET MVC сегодня, особенно после того, как Microsoft полностью перешла на jQuery, кажется плохой идеей.

Итак, после разглагольствования вот моя рекомендация:

<% using (Html.BeginForm("Action", "Controller", new { id = Model.id }) { %>

а затем ненавязчиво прикрепите обработчик отправки, используя jquery в отдельном файле:

$(function() {
    $('form').submit(function() {
        $.ajax({
            url: this.action,
            type: this.method,
            success: function(result) {
                // feel free to execute any code 
                // in the success callback
                $('#result').html(result);
            }
        });
        return false;
    });
});

или используя отличный плагин формы jquery:

$(function() {
    $('form').ajaxForm(function(result) {
        // feel free to execute any code 
        // in the success callback
        $('#result').html(result);
    });
});

Преимущества такого подхода:

  • Ненавязчивый
  • Четкое разделение между разметкой и javascript
  • Кеширование файлов javascript и снижение использования полосы пропускания

Дополнительное преимущество: отсутствие головной боли.

person Darin Dimitrov    schedule 01.10.2010
comment
Как передать идентификатор модели функции .ajax? - person Nick Masao; 28.03.2011
comment
@Nick Masao, вы можете включить его как скрытое поле внутри формы. - person Darin Dimitrov; 28.03.2011
comment
@Nick Masao, вы также можете включить опцию 'data' в блок опций, передаваемый опции ajax. I.E. $ .ajax ({..., данные: {id: @ Model.id}, ...}); - person Brian; 13.04.2011
comment
Так или иначе мой браузер все еще просит меня сохранить файл JSON ... Почему он это делает? Может, если бы у меня была какая-то подсказка, это помогло бы мне преодолеть эту горбушку. - person SoftwareSavant; 18.07.2012
comment
@DmainEvent, какой из двух подходов вы используете? Если вы используете плагин jquery.form, и ваша форма содержит вводимые файлы, и вы используете IE, убедитесь, что у вас есть прочтите документацию и заключите свой ответ JSON в теги <textarea>. - person Darin Dimitrov; 18.07.2012
comment
Я не использую плагин jquery.form ... Я использую первую технику ... Так или иначе, моя ('form'). Submit никогда не вызывает ... Я должен проверить, есть ли у меня правильные теги ... Я обновил свой вопрос ... если вы хотите взглянуть на него, я был бы признателен stackoverflow.com/ q / 10839908/729820 - person SoftwareSavant; 18.07.2012
comment
@DmainEvent, похоже, на ваш вопрос уже дан ответ. Есть принятый ответ. - person Darin Dimitrov; 18.07.2012
comment
да, на первоначальный вопрос был дан ответ, недавно обновил. Я мог убрать ответ, но я подумал, что вопрос достаточно похож, и не было причин добавлять совершенно новый вопрос. Хотя я сделал ... stackoverflow.com/q/11531143/729820 - person SoftwareSavant; 18.07.2012

Я продолжал оглядываться и нашел здесь ответ:

Назначьте функцию Javascript свойству AjaxOptions OnSuccess вывести ошибку - ASP.NET MVC (с невыбранным ответом)

Цитата Atzu

Если вам нужно передать какой-либо параметр событию OnSuccess, вам, возможно, придется написать функцию таким образом.

OnSuccess = "function(){exampleFunction('" + param1 + "');}

и это сработало для меня!

person Francisco Noriega    schedule 01.10.2010