Asp.net-Mvc

Json返回時如何讀取模型狀態錯誤?

  • September 7, 2016

如何顯示 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 });
   }

我在視圖中的程式碼必須是什麼才能讀取 ModelState 錯誤並顯示它們?

我在視圖中讀取 JSON 值的實際程式碼如下:

function createCategoryComplete(e) { 
   var obj = e.get_object(); 
   alert(obj.Values); 
} 

這是草稿程式碼,但同樣的想法在生產中也適用於我。這裡的主要思想是 Json 錯誤具有預定義的標籤名稱,普通對像不會有。對於錯誤驗證錯誤,HTML 使用 JavaScript 重新創建(頂部摘要和表單元素突出顯示)。

伺服器端:

 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();

客戶端:

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); } );

為什麼不將原始ModelState對象返回給客戶端,然後使用 jQuery 讀取值。對我來說它看起來更簡單,並使用通用資料結構(.net’s ModelState

C#:

return Json(ModelState);

js:

var message = "";
if (e.response.length > 0) {
   $.each(e.response, function(i, fieldItem) {
       $.each(fieldItem.Value.Errors, function(j, errItem) {
           message += errItem.ErrorMessage;
       });
       message += "\n";
   });
   alert(message);
}

引用自:https://stackoverflow.com/questions/2808327