Как считать modelstate ошибки при возврате Json?

Как я могу отобразить ошибки ModelState, возвращенные JSON?

Я хочу сделать что-то вроде этого:

 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); 
} 
14
задан Dan Beaulieu 20 May 2015 в 23:19
поделиться

2 ответа

Если вы возвращаете JSON, вы не можете использовать ModelState. Все, что нужно представлению, должно содержаться внутри строки JSON. Поэтому вместо добавления ошибки в ModelState вы можете добавить ее в сериализуемую модель:

public ActionResult Index()
{
    return Json(new 
    {
        errorControl = "_FORM",
        errorMessage = "Username or password is incorrect.",
        someOtherProperty = "some other value"
    });
}
-10
ответ дан 1 December 2019 в 06:39
поделиться

Это черновик кода, но та же идея работает для меня в производственной среде. Основная идея здесь в том, что ошибки 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); } );
48
ответ дан 1 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: