Forms MVC jquery ajax表单服务器端验证

Forms MVC jquery ajax表单服务器端验证,forms,jquery,asp.net-mvc-4,validation,Forms,Jquery,Asp.net Mvc 4,Validation,我们的网站上有许多表单,都是用jquery.dialog显示的,我们使用ajax post请求提交它们 我已经做了大量的研究,从我所知道的情况来看,对于如何从服务器端返回ajax请求导致的验证错误,还没有任何明确的模式 几乎我能找到的唯一模式是发布表单,然后在服务器端执行验证,在任何一种情况下都返回一个封装结果的json对象,如果结果不正确,则返回表单html 即 {result:true} {success:false,html=“…”} 因此,如果结果为false,则需要重新连接附加到表单

我们的网站上有许多表单,都是用jquery.dialog显示的,我们使用ajax post请求提交它们

我已经做了大量的研究,从我所知道的情况来看,对于如何从服务器端返回ajax请求导致的验证错误,还没有任何明确的模式

几乎我能找到的唯一模式是发布表单,然后在服务器端执行验证,在任何一种情况下都返回一个封装结果的json对象,如果结果不正确,则返回表单html

{result:true}
{success:false,html=“…”}
因此,如果结果为false,则需要重新连接附加到表单上项目的所有事件,因为您将使用出现验证错误的新表单替换旧表单

这似乎是一种不错的方法,但最终可能会向客户端返回更多的数据,而客户端只需要验证消息,并且您还被迫重新连接表单,这有点烦人

我还发现了另外一个例子,即以某种方式获取验证错误,并从操作返回json对象,然后告诉客户机根据正确的字段显示这些错误


是否有任何框架可以简化此过程,或者我应该编写自己的框架,还是坚持返回表单的整个部分,并在验证不正确时重新布线?

我不知道有任何框架可以处理此特定情况—我也不知道有明确的最佳实践—但序列化非常容易验证错误并将其作为JSON对象返回。您可以在ModelStateDictionary上尝试此扩展方法:

public static IEnumerable<ValidationResult> GetValidationResults(this ModelStateDictionary dictionary)
{
    foreach (var key in dictionary.Keys)
        foreach (var error in dictionary[key].Errors)
            if (error != null)
                yield return new ValidationResult(error.ErrorMessage, new string[] { key });
}
但是如果您是对的,那么您必须循环对象并将错误附加到正确的字段中。如果将ClientValidationEnabled和UnobtrusiveJavaScriptEnabled设置为true,则循环将如下所示:

$.each(errors, function(i, item) {
    $('span[data-valmsg-for=' + item.MemberNames[0] + ']').html(item.ErrorMessage);
})

如果没有,那么将错误消息与它们各自的字段进行匹配就不会那么困难,因为对象包含字段名。这肯定会在整个过程中为您节省一些数据,但它将更大的验证责任转移到Javascript中。正如我所说,我不知道是否有明确的最佳实践,但我在过去成功地使用了这种方法。

我将采用这种方法,但如果使用jquery validate,则可以将它们传递给validator.batherRors(),如果它们是正确的json格式,而不是遍历我发现的每个错误
if (!ModelState.IsValid)
{
    return new JsonResult(ModelState.GetValidationResults());
}
$.each(errors, function(i, item) {
    $('span[data-valmsg-for=' + item.MemberNames[0] + ']').html(item.ErrorMessage);
})