如何将自定义客户端验证添加到从 MVC5 中的注释生成的验证 VB.NET
How can I add custom client side validation to validation that was generated from annotations in MVC5 VB.NET
我添加了一些注释来以模式形式进行简单的必填字段验证。现在我需要对所涉及的几个字段的唯一性进行一些复杂的检查。
我想避免使用自定义注释来执行此操作,因为模型中需要验证的字段需要模型中不存在的额外信息。
我希望能够通过脚本向现有验证添加新规则。
不幸的是,我似乎无法同时使用新规则和现有规则。
如果我执行以下操作,则 仅应用新规则,所有现有规则(必填字段等)都会消失。
jQuery.validator.addMethod("uniqueresourceid",
function(value, element, options) {
return ResourceIDValidation(options.resourceSet, value, options.originalresourceidpropertyname);
}, "This resource ID is already inuse.");
var validator = $('#InstitutionModalForm').validate();
$('#Institution_NameResourceID').rules("add", {
uniqueresourceid: {
resourceSet: "Institutions",
resourceId: $('#NameResourceID').val(),
oldResourceId: "OriginalNameResourceID"
}
});
function ResourceIDValidation(ResourceSet, ResourceID, OldResourceIDField) {
var valid = false;
$.ajax({
type: "POST",
url: "@Url.Action("ValidateResourceID", "Admin")",
traditional: true,
contentType: 'application/json; charset=utf-8',
async: false,
data: JSON.stringify({
ResourceSet: ResourceSet,
ResourceID: ResourceID,
OldResourceID: $('#' + OldResourceIDField).val(),
}),
success: function (result) {
valid = result;
},
error: function (result) {
console.log(data);
valid = false;
}
});
return valid;
}
如果我删除 'var validator =...' 行,那么 只有原始的 验证(必填字段等)会触发。
我看不出为什么这不可能,但我似乎无法弄清楚如何让它发挥作用。
我不是很清楚这些不显眼的东西是如何神奇的,但是不应该有一种方法可以连接到服务器端注释生成的任何验证器,这样我就可以在其中添加一个新规则JS?
严格来说,这是可能的,但我可以看出您不想这样做的一些非常重要的原因。
最重要的是,这会创建 仅客户端验证。这意味着如果有人恶意提交表单,或者如果他们没有启用 JS,那么 您的服务器端代码将不会执行此验证并且可能会中断 .
除此之外,它使您的代码更难维护,因为验证在您的代码中并不像使用注释那样容易地看到。
虽然这样做可能是一个 非常糟糕的主意 ,但您可以通过这种方式实现它。在 "addMethod" 上方添加此代码会导致它按照我最初的预期进行验证。
$('#NameResourceID').attr("data-val", "true");
$('#NameResourceID').attr("data-val-uniqueresourceid", "Resource ID must be unique.");
$('#NameResourceID').attr("data-val-uniqueresourceid-resourceset","institutions");
$('#NameResourceID').attr("data-val-uniqueresourceid-originalresourceidpropertyname","OriginalNameResourceID");
改为执行此操作:按照 Stephen Muecke 在问题评论中建议的那样实施自定义验证注释。这是更多的工作,但最终是更好的练习。 This 是我能找到的关于该主题的(对我)最有帮助的教程。
我添加了一些注释来以模式形式进行简单的必填字段验证。现在我需要对所涉及的几个字段的唯一性进行一些复杂的检查。
我想避免使用自定义注释来执行此操作,因为模型中需要验证的字段需要模型中不存在的额外信息。
我希望能够通过脚本向现有验证添加新规则。
不幸的是,我似乎无法同时使用新规则和现有规则。
如果我执行以下操作,则 仅应用新规则,所有现有规则(必填字段等)都会消失。
jQuery.validator.addMethod("uniqueresourceid",
function(value, element, options) {
return ResourceIDValidation(options.resourceSet, value, options.originalresourceidpropertyname);
}, "This resource ID is already inuse.");
var validator = $('#InstitutionModalForm').validate();
$('#Institution_NameResourceID').rules("add", {
uniqueresourceid: {
resourceSet: "Institutions",
resourceId: $('#NameResourceID').val(),
oldResourceId: "OriginalNameResourceID"
}
});
function ResourceIDValidation(ResourceSet, ResourceID, OldResourceIDField) {
var valid = false;
$.ajax({
type: "POST",
url: "@Url.Action("ValidateResourceID", "Admin")",
traditional: true,
contentType: 'application/json; charset=utf-8',
async: false,
data: JSON.stringify({
ResourceSet: ResourceSet,
ResourceID: ResourceID,
OldResourceID: $('#' + OldResourceIDField).val(),
}),
success: function (result) {
valid = result;
},
error: function (result) {
console.log(data);
valid = false;
}
});
return valid;
}
如果我删除 'var validator =...' 行,那么 只有原始的 验证(必填字段等)会触发。
我看不出为什么这不可能,但我似乎无法弄清楚如何让它发挥作用。
我不是很清楚这些不显眼的东西是如何神奇的,但是不应该有一种方法可以连接到服务器端注释生成的任何验证器,这样我就可以在其中添加一个新规则JS?
严格来说,这是可能的,但我可以看出您不想这样做的一些非常重要的原因。
最重要的是,这会创建 仅客户端验证。这意味着如果有人恶意提交表单,或者如果他们没有启用 JS,那么 您的服务器端代码将不会执行此验证并且可能会中断 .
除此之外,它使您的代码更难维护,因为验证在您的代码中并不像使用注释那样容易地看到。
虽然这样做可能是一个 非常糟糕的主意 ,但您可以通过这种方式实现它。在 "addMethod" 上方添加此代码会导致它按照我最初的预期进行验证。
$('#NameResourceID').attr("data-val", "true");
$('#NameResourceID').attr("data-val-uniqueresourceid", "Resource ID must be unique.");
$('#NameResourceID').attr("data-val-uniqueresourceid-resourceset","institutions");
$('#NameResourceID').attr("data-val-uniqueresourceid-originalresourceidpropertyname","OriginalNameResourceID");
改为执行此操作:按照 Stephen Muecke 在问题评论中建议的那样实施自定义验证注释。这是更多的工作,但最终是更好的练习。 This 是我能找到的关于该主题的(对我)最有帮助的教程。