我创建了一个自定义属性来从配置文件中读取字符串长度值的值。我正在使用使用 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 文件中启用了客户端验证。
我所有使用数据注释的客户端验证都正常工作,除了这个自定义属性。
我不知道如何进一步进行,请提供任何帮助...
通过 Ajax 加载部件需要重新分析新内容,以便验证框架能够理解 HTML 中任何不显眼的验证属性。我假设你正在使用jquery validate。
因此,如果您将包含表单的某些内容加载到某个容器div 中,那么:
var form = $(newContentContainerDiv).find("form");
$.validator.unobtrusive.parse(form);
。这将重新分析新表单中的验证属性。
这是通过 Ajax 加载新内容时的要求,因为验证 f/w 不会知道它。
如果你想测试你的属性是否肯定有效,那么只需在一些常规视图中包含部分(即不使用Ajax),如果你的属性有效,那么它应该在没有任何额外工作的情况下进行验证。