有没有办法让数据注释成为条件?我有一个表Party
,我存储了组织和人员。如果我要添加一个组织,我不希望需要字段 surname ,但前提是我要添加一个人。
public class Party
{
[Required(ErrorMessage = "{0} is missing")]
[DisplayName("Your surname")]
public object surname { get; set; }
[DisplayName("Type")]
public object party_type { get; set; }
...
}
我想要一个条件所需数据注释的条件,例如:
if (party_type=='P')
然后需要姓氏,否则姓氏可以为空。
修改
如果我必须将此验证移动到控制器,我该怎么做?如何从那里触发相同的错误消息?
答案 0 :(得分:32)
您可以使模型继承自IValidatableObject,然后将自定义逻辑放入Validate方法中。您还必须从属性中删除RequredAttribute。您将不得不编写一些自定义javascript来验证客户端上的此规则,因为Validate方法不会转换为不显眼的验证框架。注意我将属性更改为字符串以避免强制转换。
此外,如果您从属性中获得其他验证错误,那么这些错误将首先触发并阻止运行Validate方法,因此只有在基于属性的验证正常时才会检测到这些错误。
public class Party : IValidatableObject
{
[DisplayName("Your surname")]
public string surname { get; set; }
[DisplayName("Type")]
public string party_type { get; set; }
...
public IEnumerable<ValidationResult> Validate( ValidationContext context )
{
if (party_type == "P" && string.IsNullOrWhitespace(surname))
{
yield return new ValidationResult("Surname is required unless the party is for an organization" );
}
}
}
在客户端上,您可以执行以下操作:
<script type="text/javascript">
$(function() {
var validator = $('form').validate();
validator.rules('add', {
'surname': {
required: {
depends: function(element) {
return $('[name=party_type]').val() == 'P';
}
},
messages: {
required: 'Surname is required unless the party is for an organization.'
}
}
});
});
</script>
答案 1 :(得分:3)
我知道这个主题有一些时间,但是如果您只想使用声明性验证,那么您可以使用这样一个简单的结构(请参阅this reference以获得更多可能性):
[RequiredIf(DependentProperty = "party_type", TargetValue = "P")]
public string surname { get; set; }
public string party_type { get; set; }
<强>更新强>
自ExpressiveAnnotations 2.0以来,发生了重大变化。现在可以用更简单的方式完成同样的事情:
[RequiredIf("party_type == 'P'")]
public string surname { get; set; }
答案 2 :(得分:0)
在Controller中你可以像这样检查: 之前if(ModelState.IsValid)
if (model.party_type == 'p')
{
this.ModelState.Remove("surname");
}