jquery - 使用 JQuery Ajax 处理 MVC5 错误

标签 jquery ajax asp.net-mvc error-handling

假设我有一个带有 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 调用,这使得它的工作方式略有不同。

enter image description here

最佳答案

现在,您的 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/

相关文章:

javascript - 为什么由 JQuery 事件处理程序引起的(对 CSS 属性的)更改只会暂时出现?

javascript - .append() 元素具有多个类

javascript - 使用 JQUERY 和 Ajax 获取祈祷时间 JSON 数据

来自.ajax调用的PHP文件未将数据插入数据库

javascript - 通过将指定的 el 传递到 subview 实例化中,将 View 渲染到父 div 中

javascript - 使用 vanilla JS ajax 发送数据并使用 Node api 读取数据

c# - ASP.NET MVC - 创建操作链接保留查询字符串

jquery - MVC/jQuery - 可以在 jQuery 中使用 Razor 变量,但不能分配给 jQuery 变量?

c# - 如何处理 ASP.NET MVC 中的 "default"异常?

javascript - 点击表单提交后如何 "GO BACK"到上一页?