客户端验证不适用于MVC3 razor视图中的自定义属性

时间:2012-12-06 16:59:42

标签: jquery asp.net-mvc-3

我创建了一个自定义属性来从配置文件中读取字符串长度值的值。我在部分视图上使用它,使用ajax get加载。

以下是我的自定义属性的代码:

public class ConfigMaxLengthAttribute : StringLengthAttribute,IClientValidatable
    {
        private readonly int _maxLength;

        public ConfigMaxLengthAttribute(string key)
            : base(int.Parse(ConfigurationManager.AppSettings[key]))
        {
            _maxLength = int.Parse(ConfigurationManager.AppSettings[key]);
        }

        public override bool IsValid(object value)
        {
            var strValue = value as string;
            if (!string.IsNullOrEmpty(strValue))
            {
                var len = strValue.Length;
                return len <= _maxLength;
            }
            return true;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRule
               {
                   ErrorMessage = "Custom Error Message",
                   ValidationType = "stringmaxlength"
               };
        }
    }

在JS文件中我包含了以下代码:

/// <reference path="jquery-1.7.2.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    return value.length>200;
}, '');

jQuery.validator.unobtrusive.adapters.add('stringmaxlength', {}, function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.messages;
    });

这为html中的字段生成以下标记:

<textarea cols="28" data-val="true" data-val-stringmaxlength="Notes entered cannot be more than 200 characters." id="UserNote" name="UserNote" rows="2" >
</textarea>

我在视图中包含了这个JS文件。在我的web.config文件中,客户端验证已启用..

     

除了这个自定义属性之外,我使用数据注释的所有客户端验证都有效..

我不知道如何继续进一步,请帮助...

1 个答案:

答案 0 :(得分:0)

通过Ajax加载部分需要您重新分析新内容,以便验证框架能够理解HTML中任何不显眼的验证属性。我假设你正在使用jquery验证。

因此,如果您将包含表单的某些内容加载到某个容器div中,那么:

var form = $(newContentContainerDiv).find("form");
$.validator.unobtrusive.parse(form);

...这将重新分析新表单中的验证属性。

这是通过Ajax加载新内容时的要求,因为验证f / w将不知道它。

如果你想测试你的属性肯定是有效的,那么只需在一些常规视图中包含partial(即不要使用Ajax),如果你的属性有效,那么它应该在没有任何额外工作的情况下进行验证。