假设我有一个带有 ViewModel 和验证的标准表单设置,如下所示。
View 模型
public class EditEventViewModel
{
public int EventID { get; set; }
[StringLength(10)]
public string EventName { get; set; }
}
View 中的表单
@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)
}
Controller
[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,将触发模型错误,并且我将在 View 中的验证消息中收到通知。
但是,我更喜欢像这样使用 JQuery AJax 提交表单。
$.ajax({
type: "POST",
url: "/EditEvent/Edit",
data: $('#editEventForm').serialize(),
success: function () {
},
error: function () {
}
});
通过这种方式,我在客户端添加一些 javascript 以在提交之前进行验证,但我仍然希望 ViewModel 中的数据注释作为备份。
当它到达 Controller 时,仍然使用 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 文件,我在其中输出有关在那里获取请求的错误的信息。 无论如何, Controller 中的模型状态错误(或任何错误)是否可以发送到此处?
@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>
再次更新
这是针对所有回复的另一项更新。
在我的 Controller 中,我将其放在 else 语句中 throw new HttpException(500, "ModelState Invalid");
(else - 意味着 ModelState 无效)
这会触发我在 Web.config 中的自定义错误发送到 Views/Shared/Error.cshtml(某种意义上),但这仅显示在 FireBug 中,如下所示。实际页面不会去任何地方。知道如何在父页面上获得它吗? 如果这没有意义,我一直在使用描述的设置 here ,发送到我的自定义错误页面。事实上,这是一个 AJAX 调用,这使得它的工作方式略有不同。
最佳答案
现在,您的 Controller 只会吞掉任何错误 - 如果模型无效,它不会保存,也不会向调用者提供任何反馈。您可以修复此问题,并通过实际返回错误来将错误返回给 jQuery:
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Some meaningful message");
关于您想要处理的内容以及要返回多少详细信息的选项有很多,但要点是您的 Controller 应该提供适合其执行的实际操作的响应。
更新
响应您的“再次更新”部分 - 我不会返回 500 - 这意味着“内部服务器错误”。如果您要返回错误,400(错误请求)可能更合适。无论如何,您的 ajax 调用遇到的问题是它从 Web 服务器(而不是您的主浏览器窗口)接收错误响应。如果我不得不猜测,错误正在服务器端处理,并且 jquery 正在接收来自自定义错误的 html 响应。
如果您打算保留自动错误处理功能,则可能应该仅将其用于未处理的错误。因此,在您的 Controller 中,您将通过返回指示此状态的非错误响应来处理无效模型(我认为其他人提到了 json 响应)。然后,所有响应都会成功,但内容会告诉您的应用程序如何表现(适当重定向等)。
关于jquery - 使用 JQuery Ajax 处理 MVC5 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31301431/