1

我们的网站上有许多表单,这些表单使用 jquery .dialog 显示,我们使用 ajax 发布请求提交它们。

我已经进行了相当多的研究,据我所知,对于如何从服务器端返回验证错误作为 ajax 请求的结果,没有任何明确的模式。

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

IE。

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

因此,在结果为假的情况下,您需要重新连接附加到表单上项目的任何事件,因为您将用具有验证错误的新表单替换旧表单。

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

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

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

4

1 回答 1

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 中。就像我说的,我不知道是否有明确的最佳实践,但我过去曾成功使用过这种方法。

于 2012-11-21T14:37:56.667 回答