我正在编写一个jQuery插件,允许我们轻松“hijax”标准HTML表单,通过AJAX而不是标准POST提交。
插件需要处理的一件事是验证错误,而在ASP.NET MVC的情况下,服务器上的ModelState错误。
我编写了一个拦截AJAX请求的Action Filter,并将Modelstate错误作为JSON返回。这适用于字段错误(即在表单上有输入的错误):
$.ajax({
url: this.action,
type: "POST",
data: $(this).serialize(),
statusCode: {
400: function (xhr, textStatus, errorThrown) {
var errors = $.parseJSON(xhr.responseText);
validator.showErrors(errors);
}
},
success: function (response) {
window.location.href = "/login/success";
}
});
jQuery Validate showErrors
函数查找与错误键匹配的name
的输入元素。
由于ASP.NET MVC中的标准约定是在您要提供“摘要”错误时执行以下操作:
ModelState.AddModelError("", "Error without a key");
这会导致jQuery validate抛出异常。
到目前为止,我提出的最佳解决方案是在表单上创建一个隐藏的输入:
<input type="hidden" name="summary" disabled/> <!-- prevent it from being submitted -->
@Html.ValidationMessage("summary")
然后在我想显示“摘要”错误时在服务器上执行以下操作:
ModelState.AddModelError("summary", "Summary error");
这并不理想,因为它不适用于多个错误。一个更好的解决方案是勾引不显眼的验证插件如何处理摘要错误,但我看不出如何做到这一点。