我有一个ASP.NET MVC 4应用程序,我希望对视图模型的几个属性进行不显眼的验证。这是一个简化版本:
ViewModel:
[AtLeastOne(new[] {"FirstName", "LastName"})]
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
验证属性:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AtLeastOneAttribute : ValidationAttribute, IClientValidatable
{
private readonly string[] _propertyNames;
public AtLeastOneAttribute(string[] propertyNames)
{
if (propertyNames == null) throw new ArgumentNullException("propertyNames");
if (propertyNames.Length < 2) throw new ArgumentOutOfRangeException("propertyNames");
_propertyNames = propertyNames;
}
public override bool IsValid(object value)
{
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ErrorMessage = "AAAAA!!!",
ValidationType = "atleastone",
};
modelClientValidationRule.ValidationParameters.Add(new KeyValuePair<string, object>("propertynames", _propertyNames));
return new[]
{
modelClientValidationRule
};
}
}
虽然我有:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
在Web.config和
中@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script type="text/javascript">
jQuery.validator.unobtrusive.adapters.add("atleastone", ['FirstName', 'LastName'], function (options) {
alert('options!');
});
</script>
在我的视图中设置没有为此验证呈现任何内容。例如,如果我为FirstName或LastName添加[Required],则会添加data- * validation属性。
如何实现此多属性自定义客户端验证?
想要看到/ DOWNLOAD THE WHOLE SOLUTION?
答案 0 :(得分:2)
在客户端添加自定义验证器的过程分为两个步骤:
首先,您需要register
validator
{让unobtrusive
框架知道存在此类验证 - 但不添加验证功能本身 ),就像你在jQuery.validator.unobtrusive.adapters.add
中所做的那样。你必须记住功能(第三个参数)是而不是验证器,它只用于规则配置(在你的情况下可以省略)。
添加validator
本身:
jQuery.validator.addMethod("atleastone", function (value, element, param)
{
alert("validating 'atleastone'");
});