我想知道是否有人知道如果我在我的模型类实现的接口上定义我的system.componentmodel.dataannotations属性,而不是直接在具体的模型类上,xVal是否会按预期工作。
public interface IFoo
{
[Required] [StringLength(30)]
string Name { get; set; }
}
然后在我的模型类中没有任何验证属性......
public class FooFoo : IFoo
{
public string Name { get; set; }
}
如果我尝试使用xVal验证FooFoo,它会使用其界面中的attrib吗?
答案 0 :(得分:4)
目前xVal.RuleProviders.DataAnnotationsRuleProvider
只查看模型类本身定义的属性。您可以在规则提供程序基类GetRulesFromProperty
中的方法PropertyAttributeRuleProviderBase
中看到此内容:
protected virtual IEnumerable<Rule> GetRulesFromProperty(
PropertyDescriptor propertyDescriptor)
{
return from att in propertyDescriptor.Attributes.OfType<TAttribute>()
from validationRule in MakeValidationRulesFromAttribute(att)
where validationRule != null
select validationRule;
}
propertyDescriptor
参数表示模型类中的属性,其Attributes
属性仅表示直接在属性本身上定义的属性。
但是,您当然可以扩展DataAnnotationsRuleProvider
并覆盖适当的方法以使其执行您想要的操作:从已实现的接口中提取验证属性。然后使用xVal注册规则提供程序:
ActiveRuleProviders.Providers.Clear();
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider());
ActiveRuleProviders.Providers.Add(new CustomRulesProvider());
要从已实现的接口中的属性获取属性,您应该扩展DataAnnotationsRuleProvider
并覆盖GetRulesFromTypeCore
。它获得System.Type
类型的参数,其方法为GetInterfaces
。