如果在接口上定义了属性,xVal会工作吗?

时间:2009-08-14 17:59:00

标签: c# .net asp.net-mvc validation xval

我想知道是否有人知道如果我在我的模型类实现的接口上定义我的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吗?

1 个答案:

答案 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