我正在尝试在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添加错误。但该错误从未出现在页面上。我是否以正确的方式接近这个?或者我需要采取不同的路线?我感谢任何帮助。
答案 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) });
}
}
进一步阅读: