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