1

我正在尝试在我的 ASP.NET MVC3 表单上实现自定义验证。

第一个自定义验证仅验证是否在文件上传输入中选择了文件。

当我只有一种客户端验证方法时,它运行良好。当我尝试添加第二个时。永远不会触发第二种验证方法。

我的属性类中的 GetValidationRules 方法

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule
                   {
                       ValidationType = "file",
                       ErrorMessage = "ResumeEmptyError".Translate("fordia_subform")
                   };

    var rule2 = new ModelClientValidationRule
    {
        ValidationType = "extension",
        ErrorMessage = "ResumeFileFormatError".Translate("fordia_subform")
    };

    var list = new List<ModelClientValidationRule>();

    list.Add(rule2);
    list.Add(rule);
    return list;
}

我认为我的 javascript 代码

<script type="text/javascript">
    jQuery.validator.addMethod("file", function (value, element) {
        return $('#ResumeFileName').val() != '';
    });

    jQuery.validator.addMethod("extension", function (value, element) {
        return $('#ResumeFileName').val() == 'a';
    });
    jQuery.validator.unobtrusive.adapters.add("file", function (options) {

        options.rules["file"] = options.params.param;
        if (options.message) {
            options.messages['file'] = options.message;
        }
    });
    jQuery.validator.unobtrusive.adapters.add("extension", function (options) {

        options.rules["extension"] = options.params.param;
        if (options.message) {
            options.messages["extension"] = options.message;
        }
    });
 </script>

当我查看我的 HTML 源代码时,我的输入元素上有以下 HTML 属性:

<input data-val="true" data-val-extension="Erreur: format error" data-val-file="Required" id="Resume" name="Resume" type="file" value="" class="input-validation-error">

在此表单上使用多种客户端验证方法我缺少什么?

4

1 回答 1

1

在您展示的脚本中,您似乎正在使用一些options.params.param从未声明或从您的验证属性传递的参数。因此,在目前的形式下,即使使用单一规则,您的脚本也无法正常工作。你说它正在工作,但我想你一定是在代码中改变了一些东西,因为你所展示的东西没有机会工作。

因此,如果您没有参数,您可以这样做(注意作为第二个参数传递给 add 适配器方法的空数组):

jQuery.validator.addMethod("file", function (value, element) {
    return $('#ResumeFileName').val() != '';
});
jQuery.validator.unobtrusive.adapters.add("file", [], function (options) {
    options.rules["file"] = options.params;
    if (options.message) {
        options.messages['file'] = options.message;
    }
});

jQuery.validator.addMethod("extension", function (value, element) {
    return $('#ResumeFileName').val() == 'a';
});
jQuery.validator.unobtrusive.adapters.add("extension", [], function (options) {
    options.rules["extension"] = options.params;
    if (options.message) {
        options.messages["extension"] = options.message;
    }
});

如果您有参数,则需要先在属性返回的验证规则上声明它们,然后在适配器中使用它们,如本文所示。

于 2012-06-29T06:29:01.330 回答