如何在Json返回时读取模型状态错误?

lea*_*ing 14 error-handling asp.net-mvc modelstate

如何显示JSON返回的ModelState错误?

我想做这样的事情:

 if (!ValidateLogOn(Name, currentPassword))
    {
        ModelState.AddModelError("_FORM", "Username or password is incorrect.");

        //Return a json object to the javascript
        return Json(new { ModelState });
    }
Run Code Online (Sandbox Code Playgroud)

在视图中我的代码必须是什么才能读取ModelState错误并显示它们?

我在视图中读取JSON值的实际代码如下:

function createCategoryComplete(e) { 
    var obj = e.get_object(); 
    alert(obj.Values); 
} 
Run Code Online (Sandbox Code Playgroud)

que*_*en3 48

这是草案代码,但同样的想法适用于我的生产.这里的主要思想是Json错误具有预定义的标记名称,没有普通对象.对于错误验证错误,使用JavaScript(顶部摘要和表单元素突出显示)重新创建HTML.

服务器端:

  public static JsonResult JsonValidation(this ModelStateDictionary state)
  {
     return new JsonResult
     {
        Data = new
           {
              Tag = "ValidationError",
              State = from e in state
                      where e.Value.Errors.Count > 0
                      select new
                      {
                         Name = e.Key,
                         Errors = e.Value.Errors.Select(x => x.ErrorMessage)
                            .Concat(e.Value.Errors.Where(x => x.Exception != null).Select(x => x.Exception.Message))
                      }
           }
     };
  }

  in action:
  if (!ModelState.IsValid && Request.IsAjaxRequest())
      return ModelState.JsonValidation();
Run Code Online (Sandbox Code Playgroud)

客户端:

function getValidationSummary() {
   var el = $(".validation-summary-errors");
   if (el.length == 0) {
      $(".title-separator").after("<div><ul class='validation-summary-errors ui-state-error'></ul></div>");
      el = $(".validation-summary-errors");
   }
   return el;
}

function getResponseValidationObject(response) {
   if (response && response.Tag && response.Tag == "ValidationError")
      return response;
   return null;
}

function CheckValidationErrorResponse(response, form, summaryElement) {
   var data = getResponseValidationObject(response);
   if (!data) return;

   var list = summaryElement || getValidationSummary();
   list.html('');
   $.each(data.State, function(i, item) {
      list.append("<li>" + item.Errors.join("</li><li>") + "</li>");
      if (form && item.Name.length > 0)
         $(form).find("*[name='" + item.Name + "']").addClass("ui-state-error");
   });
}

$.ajax(... function(response) { 
   CheckValidationErrorResponse(xhr.responseText); } );
Run Code Online (Sandbox Code Playgroud)

  • 做得很好!您提供的代码也非常便携.我唯一需要改变的是"$(".title-separator")"以匹配我的DOM. (2认同)

Dar*_*rov -10

如果返回 JSON,则无法使用 ModelState。视图所需的所有内容都应包含在 JSON 字符串内。因此,您可以将错误添加到正在序列化的模型中,而不是将错误添加到 ModelState 中:

public ActionResult Index()
{
    return Json(new 
    {
        errorControl = "_FORM",
        errorMessage = "Username or password is incorrect.",
        someOtherProperty = "some other value"
    });
}
Run Code Online (Sandbox Code Playgroud)