MVC jquery ajax表单服务器端验证

时间:2012-11-21 08:57:15

标签: forms jquery asp.net-mvc-4 validation

我们网站上有许多表格,用jquery .dialog显示,我们使用ajax post请求提交。

我做了一些研究,据我所知,由于ajax请求,如何从服务器端返回验证错误没有明确的模式。

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

{result: true}
{success: false, html =  "<form>....</form>"}

因此,如果结果为false,则需要重新连接附加到表单上项目的任何事件,就像使用具有验证错误的新表单替换旧表单一样。

这似乎是一个不错的方法,但是你最终可能会向客户端返回更多的数据,当他们真的需要验证消息时你需要重新连接表单,这有点烦人

我确实发现另外一个提到以某种方式获取验证错误并将其返回到操作中的json对象中,并以某种方式告诉客户端将其显示在正确的字段中。

是否有任何框架可以使这更容易,或者我应该自己编写或只是坚持返回表单的整个部分并在验证不正确时重新布线?

1 个答案:

答案 0 :(得分:2)

我不知道任何处理这种特殊情况的框架 - 我不知道有一个明确的最佳实践 - 但是很容易序列化验证错误并将它们作为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 });
}

在控制器中:

if (!ModelState.IsValid)
{
    return new JsonResult(ModelState.GetValidationResults());
}

但是你是对的,然后你必须遍历对象并将错误附加到正确的字段。如果您将ClientValidationEnabled和UnobtrusiveJavaScriptEnabled设置为true,则循环将如下所示:

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

如果不是,则将错误消息与其各自的字段匹配并不困难,因为该对象包含字段名称。这肯定会为您节省一些数据,但它会将更大的验证责任份额转移到Javascript中。就像我说的那样,我不知道有一个明确的最佳实践,但我过去使用过这种方法并取得了成功。