MVC 4 Ajax.BeginForm和ModelState.AddModelError

时间:2014-01-23 14:31:15

标签: ajax asp.net-mvc-4 razor

我正在尝试在ajax提交返回错误后显示错误。我不确定我错过了什么,但我无法让它发挥作用。这个问题基本上是一回事 - ModelState.AddModelError is not being displayed inside my view但我仍然没有运气。我对Ajax和MVC(任何版本)的经验仍然有点受限。这是一个非常简单的例子,我从前一个链接获取了大部分内容。

查看:test.cshtml

@model TestProject.VisitLabResult

@Scripts.Render("~/Scripts/jquery.unobtrusive-ajax.min.js")
@Scripts.Render("~/Scripts/ckeditor/ckeditor.js")

@{
    AjaxOptions ajaxOpts = new AjaxOptions
    {
        Url = Url.Action("test"),
        HttpMethod = "Post",
        LoadingElementId = "loading",
        LoadingElementDuration = 500,
        OnSuccess = "processData"
    };
}
@Html.ValidationMessage("CustomError")


<div id="loading" class="load" style="display:none">
    <p>Saving...</p>
</div>

<table>
@for (int item = 0; item < 10; item++)
{
    <tr id = @item>
    @using (Ajax.BeginForm(ajaxOpts))
    {  
        @Html.ValidationSummary(true)

        @Html.AntiForgeryToken()

        <td>
            <input type="submit" value="Create" />
        </td>

        <td id = @(item.ToString() + "td")>
        </td>
    }
    </tr>
    }
</table>

Controller:HomeController.cs

public ActionResult test()
{
    return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult test(VisitLabResult vlr, int visitid = 28)
{
    try
    {
        if (ModelState.IsValid)
        {
            if (Request.IsAjaxRequest())
            {
                throw new Exception("error");
            }
            else
                return View(vlr);
        }
        else
            return View(vlr);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("CustomError", "The Same test Type might have been already created, go back to the Visit page to see the available Lab Tests");
        return View(vlr);
    }
}

模型

public class VisitLabResult
{
    public int visitid { get; set; }
}

如果是Ajax请求,则抛出错误并将其捕获,并向ModelState添加错误。但该错误从未出现在页面上。我是否以正确的方式接近这个?或者我需要采取不同的路线?我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

只是为了解释其他人遇到这个问题的解决方案。根据{{​​3}}返回的HTTP代码,ajax助手触发OnSuccess vs OnFailure

  

AjaxOptions docs:如果响应状态 在200范围内,则会调用此函数。
  OnSuccess:如果响应状态不是在200范围内,则会调用此函数。

换句话说,您必须通过更改Response.StatusCode并在OnFailure js方法中返回您期望的任何值来手动指定返回ActionResult时出现故障。您可以根据您想要的任何业务逻辑(即catch Exception ex)!ModelState.IsValid ...)

来驱动它
[HttpPost]
public ActionResult Search(Person model) 
{
  if (ModelState.IsValid) {
    // if valid, return a HTML view inserted by AJAX helper
    var results = PersonRepository.Get(model)
    return PartialView("Resulsts", vm);

  } else {
    // if invalid, return a JSON object and handle with OnFailure method
    Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) });

  }
}

进一步阅读