3

我想知道如果我在模型类实现的接口上定义我的 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,它会使用其接口中的属性吗?

4

1 回答 1

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

于 2009-08-14T18:29:06.107 回答