将错误添加到没有键的JQuery非干扰性验证摘要
我有一个表单,它使用了不引人注目的JQuery验证和验证摘要。它工作得很好。但是,此表单执行一个Ajax POST,返回JSON结果。如果结果==true,那么我继续。但是,如果JSON结果返回一个消息数组,我想启动表单验证以更新字段。返回的错误如下所示:将错误添加到没有键的JQuery非干扰性验证摘要,jquery,asp.net-mvc-4,unobtrusive-validation,Jquery,Asp.net Mvc 4,Unobtrusive Validation,我有一个表单,它使用了不引人注目的JQuery验证和验证摘要。它工作得很好。但是,此表单执行一个Ajax POST,返回JSON结果。如果结果==true,那么我继续。但是,如果JSON结果返回一个消息数组,我想启动表单验证以更新字段。返回的错误如下所示: { "errors": [ { "key" : "NameFirst", "message": "This is the message" }, { "key" : "NameLast", "messag
{
"errors": [
{ "key" : "NameFirst", "message": "This is the message" },
{ "key" : "NameLast", "message": "This is the message" }
]
}
我解析JSON结果并调用barshorrors(),如下所示:
我不能在这些上调用淋浴器,因为它们没有映射到字段标识符。一旦我被告知如何更新摘要,我确信我可以将项目附加到通用消息的列表中,但我愿意接受其他建议。谢谢
更新
这是我最后做的,似乎效果很好。除了对有效的键入错误调用错误外,我还必须手动生成摘要:
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);
var$summary=$form.find(“[data valmsg summary=true]”)
.addClass(“验证摘要错误”)
.removeClass(“有效验证摘要”);
var$ul=$summary.find(“ul”).empty();
var error={};
$.each(response.errors,function(){
如果(此.key)
错误[this.key]=this.message;
$(“”)html(this.message).appendTo($ul);
});
$form.validate().RORS(错误);
我希望这能帮助其他人。我遇到了同样的问题,无法找到更干净的方法。这就是我想做的 代替这个
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);
}
for(var j=0;j
把这个,
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);
});
}
var error={},无键=0;
对于(var j=0;j ”)html(m).appendTo(list);
});
}
这基本上就是jQuery.validate.unobtrusive所做的
您认为如何?我需要将自己的自定义错误消息添加到摘要列表中。经过一天左右的阅读jqueryvalidate和untrusivevalidation源代码,这里是我最终使用的解决方案 首先我申报了我的表格
@using (Html.BeginForm(null, null, FormMethod.Post, new {id = "formA"}))
{
@Html.ValidationSummary()
.....
.....
设置id很重要,因为我在javascript代码中使用此id来检索表单对象
我使用以下代码更新提交时的摘要错误列表
$(function () {
var formValidator,
$form = $("#formA");
// add handler to the forms submit action
$form.submit(function () {
if (!formValidator) {
formValidator = $form.validate({}); // Get existing jquery validate object
}
var errorList = [];
// get existing summary errors from jQuery validate
$.each(formValidator.errorList, function (index, errorListItem) {
errorList.push(errorListItem.message);
});
// add our own errors
if (testForErrorCondidtionA()) {
errorList.push("Please fix error condition A!");
}
if (testForErrorCondidtionB()) {
errorList.push("Please fix error condition B!");
}
// No errors, do nothing
if (0 === errorList.length) {
return true; // allow submit
}
// find summary div
var $summary = $form.find("[data-valmsg-summary=true]");
// find the unordered list
var $ul = $summary.find("ul");
// Clear existing errors from DOM by removing all element from the list
$ul.empty();
// Add all errors to the list
$.each(errorList, function (index, message) {
$("<li />").html(message).appendTo($ul);
});
// Add the appropriate class to the summary div
$summary.removeClass("validation-summary-valid")
.addClass("validation-summary-errors");
return false; // Block the submit
});
});
$(函数(){
var formValidator,
$form=$(“#formA”);
//将处理程序添加到表单提交操作
$form.submit(函数(){
如果(!formValidator){
formValidator=$form.validate({});//获取现有的jquery验证对象
}
var errorList=[];
//从jQuery验证中获取现有摘要错误
$.each(formValidator.errorList,函数(索引,errorListItem){
errorList.push(errorListItem.message);
});
//加上我们自己的错误
if(testForErrorConditionA()){
errorList.push(“请修复错误条件A!”);
}
if(testForErrorConditionB()){
errorList.push(“请修复错误条件B!”);
}
//没有错误,什么也不做
如果(0==errorList.length){
返回true;//允许提交
}
//查找摘要div
var$summary=$form.find(“[data valmsg summary=true]”);
//查找无序列表
var$ul=$summary.find(“ul”);
//通过从列表中删除所有元素,从DOM中清除现有错误
$ul.empty();
//将所有错误添加到列表中
$.each(错误列表、函数(索引、消息){
$(“”)html(message.appendTo($ul);
});
//将适当的类添加到summary div
$summary.removeClass(“有效验证摘要”)
.addClass(“验证摘要错误”);
return false;//阻止提交
});
});
这个提交处理程序总是在不引人注目的处理程序之后调用,这意味着我们从jQuery validate检索的摘要错误列表总是最新的
希望这个答案能有所帮助,因为一旦您偏离标准案例,不引人注目的验证可能会变得棘手。MVC 5错误清除方法(与上述方法略有不同):
享受吧 对于我的工作,我添加了如下错误
var Frm = "#SomeFrm"
, $validator = $(Frm).validate();
if (SomeNeedValid())
{
$validator.errorList.push({"message":"fix error"});
$(Frm).trigger('invalid-form.validate', validator);
}
这几乎就是我最后所做的。但是,如果存在未映射到字段名的键,则会引发异常。它似乎传递了一个null元素,最终尝试调用highlight(),从而导致“无法读取未定义的属性“type”错误。所以我不能用你的无钥匙增强器。我将用类似的东西更新我的帖子。我基本上会将所有错误添加到UL中,但只会将有效的密钥错误添加到error对象中。欢迎使用Stack Overflow!请添加一些解释,说明此代码为何有助于OP。这将有助于提供未来观众可以从中学习的答案。有关详细信息,请参阅。@Sumgoy您好,我尝试了您的解决方案,但在第二个提交按钮上得到了错误列表。请看我的问题,这样你能更好地理解它。
$(function () {
var formValidator,
$form = $("#formA");
// add handler to the forms submit action
$form.submit(function () {
if (!formValidator) {
formValidator = $form.validate({}); // Get existing jquery validate object
}
var errorList = [];
// get existing summary errors from jQuery validate
$.each(formValidator.errorList, function (index, errorListItem) {
errorList.push(errorListItem.message);
});
// add our own errors
if (testForErrorCondidtionA()) {
errorList.push("Please fix error condition A!");
}
if (testForErrorCondidtionB()) {
errorList.push("Please fix error condition B!");
}
// No errors, do nothing
if (0 === errorList.length) {
return true; // allow submit
}
// find summary div
var $summary = $form.find("[data-valmsg-summary=true]");
// find the unordered list
var $ul = $summary.find("ul");
// Clear existing errors from DOM by removing all element from the list
$ul.empty();
// Add all errors to the list
$.each(errorList, function (index, message) {
$("<li />").html(message).appendTo($ul);
});
// Add the appropriate class to the summary div
$summary.removeClass("validation-summary-valid")
.addClass("validation-summary-errors");
return false; // Block the submit
});
});
if (!formValidator) {
formValidator = $form.validate({}); // Get existing jquery validate object
}
// get existing summary errors from jQuery validate
$.each(formValidator.errorList, function (index, errorListItem) {
errorList.push(errorListItem.message);
});
// add our own errors
if (testForErrorCondidtionA()) {
errorList.push("Please fix error condition A!");
}
//unobtrusiveValidation should do the ul/summary dirty work.
$form.trigger('invalid-form.validate', formValidator);
function resetValidation() {
var form = $('#formName');
var summary = form.find('[data-valmsg-summary=true]');
var ul = summary.find('ul');
ul.empty();
summary.removeClass('validation-summary-errors').addClass('validation-summary-valid');
}
var Frm = "#SomeFrm"
, $validator = $(Frm).validate();
if (SomeNeedValid())
{
$validator.errorList.push({"message":"fix error"});
$(Frm).trigger('invalid-form.validate', validator);
}