Asp.net-Mvc
Json返回時如何讀取模型狀態錯誤?
如何顯示 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’sModelState)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); }