当前位置 : 主页 > 网页制作 > JQuery >

使用JQuery Ajax进行MVC5错误处理

来源:互联网 收集:自由互联 发布时间:2021-06-15
假设我有一个带有ViewModel的标准表单设置和这样的验证. 视图模型 public class EditEventViewModel{ public int EventID { get; set; } [StringLength(10)] public string EventName { get; set; }} 视图中的表单 @using (Ht
假设我有一个带有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语句中抛出新的HttpException(500,“ModelState Invalid”); (否则 – 意味着ModelState无效)

这会在Web.config中触发我的自定义错误以发送到Views / Shared / Error.cshtml,(种类),但这只会在FireBug中显示出来.实际的页面不会去任何地方.知道如何在父页面上得到这个吗?
如果这没有意义,我一直在使用here描述的设置,发送到我的自定义错误页面.事实上这是一个AJAX调用,这使得这项工作有所不同.

现在,您的控制器只是吞下任何错误 – 如果模型无效,它只是不保存并且从不向调用者提供任何反馈.您可以通过实际返回错误来修复此问题并让它向jQuery返回错误:

return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Some meaningful message");

关于你想要处理什么以及返回多少细节的许多选项,但重点是你的控制器应该提供适合它所执行的实际操作的响应.

UPDATE

为了回应你的“再次更新”部分 – 我不会返回500 – 这意味着“内部服务器错误”.如果要返回错误,则400(错误请求)可能更合适.无论如何,您对ajax调用的问题是它从Web服务器(而不是您的主浏览器窗口)收到错误响应.如果我不得不猜测,错误是在服务器端处理,你是jquery从你的自定义错误接收html响应.

如果您要保留自动错误处理,则应该仅将其用于未处理的错误.因此,在您的控制器中,您将通过返回指示此状态的非错误响应来处理无效模型(我认为其他人提到了json响应).然后,所有响应都会成功,但内容会告诉您的应用程序如何表现(适当地重定向等等).

网友评论