我正在使用DataAnnotations
utils验证一个类。
我有一个具有Title
属性和Item
属性的类。
我想将RequiredAttribute
应用于Title
属性,但仅当Item
属性为null时才应该无效;如果使用对象设置Item
属性,则不需要Title
。
简而言之,我希望RequiredAttribute
只有在满足类中的条件时才能验证。
如何做到这一点。
由于我没有找到其他方法,并且因为我通常不经常需要这个功能,所以我决定使用类级验证器进行粗略的处理。 我的问题是,有没有办法手动更新UI,使标题文本框具有红框,即使其无效?
更新2
我希望类级验证器在字段上进行汇总。
例如,我必须填写Cost和SalesPrice字段,我想确保SalesPrice>成本并使SalesPrice无效,否则,我不希望在类级别上出现全局验证错误。
我更喜欢用xamly的方式来做。
答案 0 :(得分:6)
您可以通过为类创建自定义验证属性来执行此操作。遗憾的是,根据我的意识,分配给属性的DataAnnotation属性无法访问父类的其他属性,因此需要创建类验证器。
使用System.ComponentModel.DataAnnotations命名空间,您需要创建继承自ValidationAttribute的自定义属性类并覆盖IsValid方法(我没有测试下面的代码,但它应该让你去):
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
sealed public class CustomAttribute: ValidationAttribute
{
public CustomAttribute()
{
}
public override bool IsValid(object value)
{
if(value is myClass)
{
return ((myClass)value).Item != null &&
string.IsNullOrEmpty(((myClass)value).Title) ? false : true;
}
else return true;
}
}
进一步挖掘看来,虽然交叉现场验证不可能开箱即用,但可以通过扩展框架来支持它。请参阅this article for details,希望这将添加到MVC的未来版本中。
答案 1 :(得分:0)
嗯,在物业层面,在MVC中难以实现偶然验证。但你可以扩展框架,或者你可以使用其他一些库来实现目标。我成功地使用nick的万无一失的验证来进行项目中的偶然验证。你可以看看here