[asp.net-mvc]如果在接口上定义了属性,xVal 将工作吗?

标签: Asp.net-MVC .Net C#
发布时间: 2017/3/25 4:41:20
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想知道是否任何人都知道是否 xVal 将正常工作如果我由我模型的类实现,而不是直接对混凝土模型类的接口上定义了我的 system.componentmodel.dataannotations 属性。

public interface IFoo
{
    [Required] [StringLength(30)]
    string Name { get; set; }
}

然后在我的模型课应该不会有任何验证属性...

public class FooFoo : IFoo
{
    public string Name { get; set; }
}

如果我尝试验证 FooFoo 与 xVal,将它使用档名从其界面吗?

解决方法 1:

目前 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

官方微信
官方QQ群
31647020