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?
любые предложения/указатели оцененный.
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 hardcoding в 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
});
Спасибо за все ваши входные данные, решение, которое работает для меня на данный момент, имеет эту функцию, прикрепленную к кнопке "Отправить" в диалоговом окне....
"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();
});
}
...это своего рода комбинация ответов, приведенных выше.
еще раз спасибо.
кнопка в порядке под частичным представлением, но похоже, что вы хотите отправить форму через 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
по мере необходимости. Вы можете получить более навороченные, но тогда этот ответ будет слишком длинным :)
Ну, jQuery submit ничего не делает, вам нужно иметь форму внутри частичного представления, тогда что происходит, когда диалоговое окно jQuery submit execute, вы вызываете свою форму submit, у которой уже определено действие.
см. мой код ниже, который не является ajax submit
});
$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();
}
});
и что касается вопроса ur внутри действия post, вы должны выполнить свою бизнес-логику, а затем вызвать " Return RedirectToAction ("viewname", new {id=xxx})"
я столкнулся с подобной проблемой сегодня, когда мне пришлось отправить форму, которая была в частичном представлении - и частичное представление было в диалоговом окне, которое было создано из другой формы!
суть заключалась в том, чтобы получить обработчик формы в частичном представлении и сериализовать его.
вот как я определил свой диалог в первой форме:
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()
});
}
}
});