在没有密钥的情况下为JQuery Unobtrusive验证摘要添加错误

Jas*_*era 13 jquery unobtrusive-validation asp.net-mvc-4

我有一个使用不显眼的JQuery验证和验证摘要的表单.它很棒.但是,此表单执行Ajax POST,返回JSON结果.如果结果== true,那么我继续.但是,如果JSON结果返回一个消息数组,我想触发表单验证以更新字段.错误返回如下:

{
    "errors": [ 
       { "key" : "NameFirst", "message": "This is the message" },
       { "key" : "NameLast", "message": "This is the message" } 
     ]
}
Run Code Online (Sandbox Code Playgroud)

我解析JSON结果并调用showErrors(),如下所示:

for (var j = 0; j < response.errors.length; j++) {
    var key = response.errors[j].key;
    var error = {};
    error[key] = response.errors[j].message;
    $form.data('validator').showErrors(error);
}
Run Code Online (Sandbox Code Playgroud)

这会正确突出显示字段,但不会更新验证摘要.我怎样才能更新?

此外,有时错误是通用的,不会映射到模型中的特定属性/字段.在这种情况下,它们返回null键,如:

{
     "errors": [ 
        { "key" : null, "message": "This is the message" },
        { "key" : null, "message": "This is the other message" }, 
        { "key" : "NameFirst", "message": "This is the message" },
        { "key" : "NameLast", "message": "This is the message" } 
      ]
 }
Run Code Online (Sandbox Code Playgroud)

我不能在那些上调用showErrors,因为它们没有映射到字段标识符.一旦我被告知如何更新摘要,我确定我可以将项目附加到列表中以获取通用消息,但我愿意接受其他建议.谢谢!

UPDATE

这是我最终做的,似乎工作得很好.除了在有效的键控错误上调用showErrors之外,我还必须手动构建摘要:

var $summary = $form.find("[data-valmsg-summary=true]")
                    .addClass("validation-summary-errors")
                    .removeClass("validation-summary-valid");
var $ul = $summary.find("ul").empty();

var error = {};
$.each(response.errors, function () {
    if (this.key)
        error[this.key] = this.message;
    $("<li />").html(this.message).appendTo($ul);
});
$form.validate().showErrors(error);
Run Code Online (Sandbox Code Playgroud)

我希望这有助于其他人.

lab*_*roo 0

我遇到了同样的问题,无法找到更干净的方法。这就是我想做的

代替这个

for (var j = 0; j < response.errors.length; j++) {
    var key = response.errors[j].key;
    var error = {};
    error[key] = response.errors[j].message;
    $form.data('validator').showErrors(error);
}
Run Code Online (Sandbox Code Playgroud)

把这个,

        var error = {}, keyLess = 0;

        for (var j = 0; j < response.errors.length; j++) {
            var key = response.errors[j].key;
            error[key || keyLess++] = response.errors[j].message;
        }

        $form.validate().showErrors(error);

        var container = $form.find("[data-valmsg-summary=true]"), 
            list = container.find("ul");

        if (list && list.length) {
            list.empty();
            container
              .addClass("validation-summary-errors")
              .removeClass("validation-summary-valid");

            $.each(error, function(k,m) {
                $("<li />").html(m).appendTo(list);
            });
        }
Run Code Online (Sandbox Code Playgroud)

这基本上就是 jQuery.validate.unobtrusive 的作用

你怎么认为?