我正在使用asp.net mvc 3开发一个Web应用程序,并且我有一些形式,POST到异步动作(通过ajax)。此操作会使用一些数据注释来查看viewmodel,以验证它。验证工作正常,但是当验证器返回错误时,我不知道如何在我的视图中返回它显示(因为POST是由ajax创建的)。
我的行动是这样的:
[HttpPost] public ActionResult SaveCustomer(Customerviewmodel input) { if (!ModelState.IsValid) { // <-- business validation return Json(new { success = false,errors = ???}); } // persist return Json(new { success = true }); }
在我看来,如何用jquery验证这个错误?
如果可以发布一些代码进行抽样…我会加以考虑!
多谢你们!
解决方法
在发生错误的情况下,我不会发送JSON,而是将表单放在部分中,然后控制器操作会在出现错误的情况下返回此部分。 JSON的问题是,事实上,您可以使用LINQ从ModelState中获取错误,但它可能是PITA在视图上显示它们。
所以:
<div id="myform"> @Html.Partial("_MyForm") </div>
然后在_MyForm.cshtml里面:
@model Customerviewmodel @using (Html.BeginForm()) { @Html.EditorFor(x => x.Foo) @Html.ValidationMessageFor(x => x.Foo) <br /> @Html.EditorFor(x => x.Bar) @Html.ValidationMessageFor(x => x.Bar) <br /> <input type="submit" value="OK" /> }
并且控制器动作将成为:
[HttpPost] public ActionResult SaveCustomer(Customerviewmodel model) { if (!ModelState.IsValid) { return PartialView("_MyForm",model); } return Json(new { success = true }); }
最后一步是AJAXify这个表单可以在一个单独的javascript文件中完成:
$(function () { $('#myform').delegate('form','submit',function () { $.ajax({ url: this.action,type: this.method,data: $(this).serialize(),success: function (result) { if (result.success) { // We have a JSON object in case of success alert('success'); } else { // We have the partial with errors in case of failure // so all we have to do is update the DOM $('#myform').html(result); } } }); return false; }); });