Как я могу отобразить ошибки 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);
}
Если вы возвращаете JSON, вы не можете использовать ModelState. Все, что нужно представлению, должно содержаться внутри строки JSON. Поэтому вместо добавления ошибки в ModelState вы можете добавить ее в сериализуемую модель:
public ActionResult Index()
{
return Json(new
{
errorControl = "_FORM",
errorMessage = "Username or password is incorrect.",
someOtherProperty = "some other value"
});
}
Это черновик кода, но та же идея работает для меня в производственной среде. Основная идея здесь в том, что ошибки 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); } );