jQuery, MVC3: отправка формы частичного просмотра в модальном диалоговом окне

В данный момент я просто играю с jQuery и MVC3, и мне интересно, как я могу отправить форму, которая была динамически загружена в диалоговое окно jQueryUI?

Мой код пока состоит из...

Javascript/jQuery

$(document).ready(function () {

    $('.trigger').live('click', function (event) {

       var id = $(this).attr('rel');

       var dialogBox = $("<div>");

       $(dialogBox).dialog({
           autoOpen: false,
           resizable: false,
           title: 'Edit',
           modal: true,
           show: "blind",
           hide: "blind",
           open: function (event, ui) {
               $(this).load("PartialEdit/" + id.toString());
           }
        }
    });

    $(dialogBox).dialog('open');

})    });

CSHTML

<h2>Detail</h2><a href="#" class="trigger" rel="1">Open</a>

Контроллер

public ActionResult PartialEdit(int id)
    {
        return PartialView(new EditViewModel() { Name = id.ToString() });
    }

    [HttpPost]
    public ActionResult PartialEdit(int id, FormCollection collection)
    {
        // What to put here???            
    }

Частичный просмотр

....@using (Html.BeginForm()){....Html.EditorFor(model => model.Name).....}....

Как видите, load() в jQuery вызывает PartialView с именем PartialEdit.

Форма загружается нормально, но я не могу понять, как отправить форму?

Вопросы

Как заставить пользовательский интерфейс отправить форму и закрыть диалоговое окно? Что должен возвращать [HttpPost]PartialEdit?

На данный момент у меня есть кнопка отправки в частичном представлении. При нажатии форма отправляется, и браузер делает все, что возвращает [HttpPost]PartialEdit (в настоящее время это приводит к отображению пустой страницы).

Однако после отправки я хотел бы вместо этого вызвать событие на стороне клиента (возможно, полное обновление страницы или частичное обновление страницы в зависимости от контекста, в котором оно используется). Я не уверен, с чего начать?

Кроме того, следует ли размещать кнопку отправки в PartialView или использовать кнопки в диалоговом окне jQuery-UI?

Любые предложения / указатели приветствуются.


person ETFairfax    schedule 22.06.2011    source источник


Ответы (5)


Попробуйте что-нибудь из строк:

open: function (event, ui) {
    $(this).load("PartialEdit/" + id.toString(), function(html) {
        $('form', html).submit(function() {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function(res) {
                    if (res.success) {
                        $(dialogBox).dialog('close');
                    }
                }
            });
            return false;
        });
    });
}

и действие контроллера может вернуть JSON:

[HttpPost]
public ActionResult PartialEdit(int id, FormCollection collection)
{ 
    // do some processing ...

    // obviously you could also return false and some error message
    // so that on the client side you could act accordingly
    return Json(new { success = true });
}

Заключительная часть для улучшения заключается в следующем:

"PartialEdit/" + id.toString()

Никогда не делайте такое жесткое кодирование URL-адресов в приложении ASP.NET MVC. Всегда используйте помощники по URL-адресам при работе с URL-адресами. Поэтому сделайте свой якорь немного более динамичным и вместо:

<a href="#" class="trigger" rel="1">Open</a>

использовать:

@Html.ActionLink(
    "Open", 
    "PartialEdit", 
    new {
        id = "1" // you probably don't need a rel attribute
    }, 
    new { 
        @class = "trigger"
    }
)

а потом:

$(this).load(this.href, function(html) {
    ...
    return false; // now that the anchor has a href don't forget this
});
person Darin Dimitrov    schedule 22.06.2011
comment
Большое спасибо за ваше предложение. На данный момент проблема в том, что $('form', html).submit(function() {...}); не работает. Должен ли мой частичный взгляд быть чем-то особенным? Пока это просто.. @using (Html.BeginForm()) { @Html.ValidationSummary(true) ‹div class=editor-label› @Html.LabelFor(model =› model.Name) ‹/div› ‹div class =editor-field› @Html.EditorFor(model =› model.Name) @Html.ValidationMessageFor(model =› model.Name) ‹/div› ‹p› ‹input type=submit value=Save /› ‹/p› } - person ETFairfax; 23.06.2011
comment
@ETFairfax, не могли бы вы определить isn't working? Возвращает ли селектор $('form', html) элемент формы, когда вы регистрируете это в консоли FireBug? Выполняется ли обратный вызов submit? - person Darin Dimitrov; 23.06.2011
comment
Извините за расплывчатость! Обратный вызов отправки не выполняется. $('form', html) возвращает длину: 0. - person ETFairfax; 23.06.2011
comment
@ETFairfax, хорошо, попробуйте присвоить форме уникальный идентификатор и использовать его в селекторе: $('#myForm').submit(...);. - person Darin Dimitrov; 23.06.2011
comment
Никакой радости - все те же результаты, что и раньше! Я продолжу играть и дам вам знать, если разгадаю тайну!! - person ETFairfax; 23.06.2011

Спасибо за ваш вклад, решение, которое работает для меня на данный момент, заключается в том, что эта функция прикреплена к кнопке «Отправить» в диалоговом окне....

"Submit": function () {
    var $this = this;
    var form = $('form', $this);
    if (!$(form).valid()) {
       return false;
    }

    $.post(form.attr("action"), JSON.stringify($(form).serializeObject()), function () {
        $($this).dialog("close").dialog("distroy").remove();
    });
}

... что представляет собой комбинацию ответов выше.

Еще раз спасибо.

person ETFairfax    schedule 27.09.2011

Кнопка в порядке при частичном представлении, но похоже, что вы хотите отправить форму через AJAX, чтобы страница не обновлялась. Вы можете сделать это следующим образом:

$('#theIdOfYourForm').live('submit', function(event){
    event.preventDefault();
    var form = $(this);
    $.post(form.attr('action'), form.serialize(), function(data){
        if (data.IsError) { alert(data.Error); }
        else { alert(data.Message); }
    });
});

И верните объект JSON из действия HttpPost PartialEdit, который определяет IsError, Error или Message по мере необходимости. Вы можете увлечься этим, но тогда этот ответ будет слишком длинным :)

person Milimetric    schedule 22.06.2011

Что ж, отправка jQuery ничего не делает, вам нужно иметь форму внутри частичного представления, тогда что происходит, когда выполняется отправка диалогового окна jQuery, вы вызываете отправку формы, для которой уже определено действие.

Смотрите мой код ниже, который не является отправкой ajax

      }); 
    $dialog
        .dialog("option", "buttons", {
            "Submit":function(){
                var dlg = $(this);
                var $frm = $(frm);
                if(onFormSubmitting != null)
                    onFormSubmitting();
                $frm.submit();
        },
        "Cancel": function() { 
            $(this).dialog("close");
            $(this).empty();
        }    

    });

И что касается нашего вопроса внутри почтового действия, вы должны выполнить свою бизнес-логику, а затем вызвать «Return RedirectToAction («viewname», new {id = xxx})»

person Vincent    schedule 24.06.2011

Сегодня я столкнулся с аналогичной проблемой, когда мне пришлось отправить форму, которая была в частичном представлении, а частичное представление было в диалоговом окне, которое было создано из другой формы!

Суть заключалась в том, чтобы получить обработчик формы в частичном представлении и сериализовать его.

Вот как я определил свой диалог в первой форме:

var udialog = $('#userdialog').dialog({
            open: function(event, ui) {                    
                $(this).load('xx');
            },
            buttons: {
                "Submit" : function(){                         
                    $.ajax(
                         {
                             url: 'xx',
                             type: "POST",
                             async: true,
                             data: $('form', $(this)).serialize()
                    });
                }
             }                 
        });
person gunnerz    schedule 04.02.2014