C# 如果属性是在接口上定义的,那么xVal会工作吗?
我想知道如果我在由模型类实现的接口上定义system.componentmodel.dataannotations属性,而不是直接在具体的模型类上,是否有人知道xVal是否会像预期的那样工作C# 如果属性是在接口上定义的,那么xVal会工作吗?,c#,.net,asp.net-mvc,validation,xval,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 strin
public interface IFoo
{
[Required] [StringLength(30)]
string Name { get; set; }
}
然后在我的模型类中没有任何验证属性
public class FooFoo : IFoo
{
public string Name { get; set; }
}
如果我尝试用xVal验证Foooo,它会从接口使用属性吗?此时,
xVal.RuleProviders.DataAnnotationsRuleProvider
只查看在模型类本身上定义的属性。您可以在规则提供程序基类propertyattributeproviderbase
中的方法GetRulesFromProperty
中看到这一点:
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;
}
要从已实现接口中的属性获取属性,您应该扩展
DataAnnotationsRuleProvider
并覆盖GetRulesFromTypeCore
。它获取的参数类型具有方法。感谢您提供的详细答案!!我想下一个问题是:有没有一种简单的方法来迭代类实现的接口?您需要这样做才能为接口上的每个属性获取PropertyDescriptor。我添加了一些关于如何获取类型的已实现接口的更多信息。看起来非常简单,非常感谢!!
ActiveRuleProviders.Providers.Clear();
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider());
ActiveRuleProviders.Providers.Add(new CustomRulesProvider());