视图模型
public class EditEventViewModel { public int EventID { get; set; } [StringLength(10)] public string EventName { get; set; } }
视图中的表单
@using (Html.BeginForm(null, null, FormMethod.Post, new {id="editEventForm"})) { @Html.AntiForgeryToken() @Html.LabelFor(model => model.EventName) @Html.EditorFor(model => model.EventName) @Html.ValidationMessageFor(model => model.EventName) }
调节器
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include = "EventName")] EventViewModel model) { //Get the specific record to be updated var eventRecord = (from e in db.Event where e.EventID == model.EventID select e).SingleOrDefault(); //Update the data if (ModelState.IsValid) { eventRecord.EventName = model.EventName; db.SaveChanges(); } return RedirectToAction("Index"); }
现在,如果我执行常规表单提交并输入字符串长度超过10的EventName,将触发模型错误,并在视图中的验证消息中通知我.
但是,我更喜欢像这样使用JQuery AJax提交表单.
$.ajax({ type: "POST", url: "/EditEvent/Edit", data: $('#editEventForm').serialize(), success: function () { }, error: function () { } });
通过这种方式,我在客户端添加一些javascript以在提交之前进行验证,但我仍然希望ViewModel中的数据注释作为备份.
当它到达控制器时,仍然使用if(ModelState.IsValid)进行检查.如果它无效,则数据不会像设计的那样写入数据库.
现在,我想知道当使用JQuery发布时,如果ModelState无效,我该怎么办.这不会触发常规验证,因此我该怎么做才能发回错误信息?
if (ModelState.IsValid) { eventRecord.EventName = model.EventName; db.SaveChanges(); } else { //What can I do here to signify an error? }
更新更多信息
我已经在Web.config中设置了自定义错误
<customErrors mode="On">
这会将错误路由到Views / Shared / Error.cshtml文件,在那里我输出有关在那里获得请求的错误的信息.
无论如何,控制器中的模型状态错误(或任何错误)可以在这里发送吗?
@model System.Web.Mvc.HandleErrorInfo @{ Layout = null; ViewBag.Title = "Error"; } <h1 class="text-danger">Error.</h1> <h2 class="text-danger">An error occurred while processing your request.</h2> <p> Controller: @Model.ControllerName <br /> Action: @Model.ActionName <br /> Exception: @Model.Exception.Message </p>
再次更新
这是另一个更新处理所有响应的部分.
在我的控制器中,我把它放在else语句中抛出新的HttpException(500,“ModelState Invalid”); (否则 – 意味着ModelState无效)
这会在Web.config中触发我的自定义错误以发送到Views / Shared / Error.cshtml,(种类),但这只会在FireBug中显示出来.实际的页面不会去任何地方.知道如何在父页面上得到这个吗?
如果这没有意义,我一直在使用here描述的设置,发送到我的自定义错误页面.事实上这是一个AJAX调用,这使得这项工作有所不同.
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Some meaningful message");
关于你想要处理什么以及返回多少细节的许多选项,但重点是你的控制器应该提供适合它所执行的实际操作的响应.
UPDATE
为了回应你的“再次更新”部分 – 我不会返回500 – 这意味着“内部服务器错误”.如果要返回错误,则400(错误请求)可能更合适.无论如何,您对ajax调用的问题是它从Web服务器(而不是您的主浏览器窗口)收到错误响应.如果我不得不猜测,错误是在服务器端处理,你是jquery从你的自定义错误接收html响应.
如果您要保留自动错误处理,则应该仅将其用于未处理的错误.因此,在您的控制器中,您将通过返回指示此状态的非错误响应来处理无效模型(我认为其他人提到了json响应).然后,所有响应都会成功,但内容会告诉您的应用程序如何表现(适当地重定向等等).