Как использовать MVC ajax и PartialViews при сохранении ошибок ModelState
Я использую MVC3. У меня есть форма, которая при отправке возвращает PartialView, который обновляет мою страницу. Вопрос / проблема заключается в том, как показать ошибки ModelState и сохранить значения формы в такте при возникновении ошибки?
Кажется, этот вопрос задавался ранее (см. Мои ссылки ниже), но я еще не нашел полного ответа / решения, но я запутался...
- Частичные представления ASP.Net MVC сохраняют свое модельное состояние?
- http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/
- Отобразить вид в виде строки
Моя очень простая модель
public class TEST_AjaxFormViewModel
{
[Required]
[StringLength(10)]
public string Name { get; set; }
}
Мой взгляд выглядит так:
<% using (Ajax.BeginForm("TEST_AjaxForm", new AjaxOptions { UpdateTargetId = "formResults" }))
{%>
<%:Html.ValidationSummary(true, "Please correct errors:")%>
<div class="editor-label">
<%:Html.LabelFor(model => model.Name)%>
</div>
<div class="editor-field">
<%:Html.TextBoxFor(model => model.Name)%>
<%:Html.ValidationMessageFor(model => model.Name)%>
</div>
<br />
<div class="editor-label"></div>
<div class="editor-field">
<button name="button" type="submit" value="Submit">
Submit
</button>
</div>
<br />
<% }%>
<div id="formResults" style="border: 1px dotted red; margin: 2.0em; padding: 1.0em;">
<p>This is where my partial view will go</p>
</div>
И мой PartialView просто выплевывает вывод:
<div class="editor-label"></div>
<div class="editor-field">
<%: Model.Name %>
</div>
<br />
И мой метод действия контроллера, как это
[HttpPost]
public ActionResult TEST_AjaxForm(TEST_AjaxFormViewModel model)
{
if (ModelState.IsValid)
{
return PartialView("TEST_AjaxFormPartialView", model);
}
//else
return View(model); // this is wrong! what should I return instead?
}
Вопрос в том, как вернуть обратно представление с ошибками ModelState?
В предоставленных мною ссылках рассказывается о возврате json с кодами состояния, чтобы клиентская сторона могла обнаружить ошибку или условие успеха (т. Е. RenderPartialViewToString). Но я не очень понимаю, как все это подключается / потребляется.
Например, в случае успеха, просто отобразить частичное представление? Если ошибка, мы просто обновить страницу с обновленным ModelState? Может кто-нибудь связать воедино кусочки и показать сквозной пример, а именно вызовы ajax View/jquery?
В стороне: как альтернативная реализация, я использовал что-то похожее на этот подход и заставил его работать, но я не знаю... это просто кажется неправильным и, поскольку я обновляю больше страницы, чем хочу, чтобы добиться успеха сценарий.
http://jvance.com/blog/2010/02/20/MakingAnAjaxFormWithJQueryInASPdotNETMVC.xhtml
например, мой контроллер выглядит следующим образом, где мои PartialViews теперь содержат мой код "формы" в версиях Success и Error.
[HttpPost]
public ActionResult TEST_AjaxFormSingleMasterDiv(TEST_AjaxFormViewModel model)
{
if (ModelState.IsValid)
{ // no model state errors
return PartialView("TEST_AjaxFormSingleMasterDivPartialView_Success", model);
}
// else, error
return PartialView("TEST_AjaxFormSingleMasterDivPartialView_Error", model);
}
Спасибо
2 ответа
Вы очень близки Вот как должен выглядеть ваш контроллер:
[HttpPost]
public ActionResult TEST_AjaxForm(TEST_AjaxFormViewModel model)
{
if (ModelState.IsValid)
{
// perhaps do some additional actions? Save data to DB?
return PartialView("TEST_AjaxFormPartialView", model);
}
//else
return PartialView("TEST_AjaxFormPartialView", model);
}
Как видите, ваш ли ModelState
действительно или нет, вы возвращаете то же представление с той же моделью. Разница лишь в том, что, если он действителен, вы можете захотеть выполнить некоторые дополнительные действия.
Чтобы отобразить ошибки, необходимо добавить в представление элемент, в котором будут отображаться ошибки. Тем не мение, Html.ValidationSummary
или же Html.ValidationMessage
или же Html.ValidationMessageFor
должны быть внутри формы, чтобы сделать. Вот ваш взгляд:
@model [namespace].TEST_AjaxFormViewModel
<%: Html.BeginForm() %>
<div><%: Html.ValidationSummary() %></div>
<div class="editor-label"></div>
<div class="editor-field">
<%: Model.Name %>
</div>
<%: Html.EndForm() %>
<br />
У меня также была эта проблема, и решение здесь сделало свою работу. все очень просто: хитрость заключается в том, чтобы содержать саму форму внутри UpdateTargetId в AjaxOptions: http://xhalent.wordpress.com/2011/02/05/using-unobtrusive-ajax-forms-in-asp-net-mvc3/