如何将自定义客户端验证添加到从 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 是我能找到的关于该主题的(对我)最有帮助的教程。