【发布时间】:2015-09-26 21:08:26
【问题描述】:
假设我有一个带有 ViewModel 和类似验证的标准表单设置。
视图模型
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 语句 throw new HttpException(500, "ModelState Invalid"); 中(else - 意味着 ModelState 无效)
这会触发我在 Web.config 中的自定义错误发送到 Views/Shared/Error.cshtml,(有点)但这只会像这样在 FireBug 中显示。实际页面不会去任何地方。知道我如何在父页面上得到这个吗? 如果这没有意义,我一直在使用here 描述的设置发送到我的自定义错误页面。这是一个 AJAX 调用的事实使得这项工作有点不同。
【问题讨论】:
-
我唯一能想到的就是序列化模型错误并将它们显示在
successstackoverflow.com/questions/2845852/… -
我已经成功地使控制器动作返回了一个响应对象,其中包括模型编辑器模板的 HTML 呈现,然后让客户端用新的编辑器 HTML 替换表单内容.这样,您可以利用 MVC 的内置错误显示和编辑器模板,同时仍然让您的页面以 AJAXy 方式运行。但是,设置它是一项相当大的工作。
-
抛出 500 响应并不是真正的用户友好,并且在这种情况下是错误处理的错误实现。您需要向用户返回一条消息,让他们知道发生了验证错误并可能包含这些消息。在下面检查我的答案。
-
也许我想错了。除了验证问题(由数据注释设置的问题)之外,还有什么会导致模型错误的吗?我已经在客户端使用 javascript 来通知用户。我只是想抓住任何可能在这一点上漏掉的错误,因为之前没有在 ModeState IsValid 上设置 else 语句。
标签: jquery ajax asp.net-mvc error-handling