如何将自定义客户端验证添加到从MVC5 VB.NET中的注释生成的验证中

时间:2015-09-15 20:31:44

标签: vb.net asp.net-mvc-5 data-annotations unobtrusive-validation

我添加了许多注释,以模态形式进行简单的必填字段验证。现在我需要对涉及的几个领域进行一些有点复杂的检查。

我希望避免使用自定义注释来执行此操作,因为需要在模型中进行验证的字段需要模型中不存在的额外信息。

我希望能够通过脚本向现有验证添加新规则。

不幸的是,我似乎无法让新规则和现有规则同时发挥作用。

如果我执行以下操作,则仅应用新规则,所有现有规则(必填字段等)都会消失。

    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中添加新规则吗?

1 个答案:

答案 0 :(得分:2)

严格来说,这是可能的但我可以看到一些非常重要的原因,为什么不想这样做

最重要的是,这会创建客户端验证。这意味着如果某人恶意地提交表单,或者他们没有启用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对我来说是最有帮助的(对我而来)教程。