条件数据注释

| 有没有一种方法可以使数据注释成为条件?我有一个表格
Party
,其中存储了组织和人员。如果我要添加组织,则不希望该字段姓为必填项,仅当我要添加人员时。
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\')
,则必须填写姓氏,否则姓氏可以为空。 编辑 如果必须将此验证移至控制器,该如何在那里进行验证?如何从那里触发相同的错误消息?     
已邀请:
        您可以使模型继承自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>
    
        我知道这个主题还有一段时间,但是如果您只想使用声明式验证,则可以使用这样一个简单的构造(有关更多可能性,请参阅此参考资料):
[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; }
    
        在Controller中,您可以像这样检查: 在if(ModelState.IsValid)之前
if (model.party_type == \'p\')
{
   this.ModelState.Remove(\"surname\");
}
    

要回复问题请先登录注册