我正在编写一个 jQuery 插件,它允许我们轻松地“hijax”一个标准的 HTML 表单,通过 AJAX 而不是标准的 POST 提交它。
插件需要处理的一件事是验证错误,在 ASP.NET MVC 的情况下,服务器上的 ModelState 错误。
我编写了一个动作过滤器,它拦截 AJAX 请求并将 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");
这并不理想,因为它不能很好地处理多个错误。一个更好的解决方案是挂钩不显眼的验证插件如何处理摘要错误,但我不知道该怎么做。