回答編集履歴

3 誤字の修正

workaholist

workaholist score 442

2017/06/16 08:49  投稿

条件付きの必須ということは、その条件のロジックを実装する必要があります。
つまりアノテーション1行では表現できないはずです。
従って、モデルにIValidatableObjectインターフェイスを実装してValidateメソッドで行うのが普通ではないでしょうか。
質問者様の追記を見て下記仕様と想定し、ソースコードを記載します。
- FLGのチェックボックスがONのときのみテキストボックスA、B、Cの必須チェックを行う
- チェックボックスがOFFの時はABCは非活性
- Dだけは常に必須チェックを行う
```C#
[Serializable]
public class TestModel : IValidatableObject
{
   public string Flg { get; set; }
   public string A { get; set; }
   public string B { get; set; }
   public string C { get; set; }
   [Required]
   public string D { get; set; }
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
       if (this.Flg == "1")
       {
           if (string.IsNullOrEmpty(this.A))
           {
               yield return new ValidationResult("Aは入力が必須です。", new string[] { "A" });
           }
           if (string.IsNullOrEmpty(this.B))
           {
               yield return new ValidationResult("Bは入力が必須です。", new string[] { "C" });
               yield return new ValidationResult("Bは入力が必須です。", new string[] { "B" });
           }
           if (string.IsNullOrEmpty(this.C))
           {
               yield return new ValidationResult("Cは入力が必須です。", new string[] { "B" });
               yield return new ValidationResult("Cは入力が必須です。", new string[] { "C" });
           }
       }
   }
}
```
2 質問者の追記を拝見し修正

workaholist

workaholist score 442

2017/06/15 19:36  投稿

条件付きの必須ということは、その条件のロジックを実装する必要があります。
つまりアノテーション1行では表現できないはずです。
従って、モデルにIValidatableObjectインターフェイスを実装してValidateメソッドで行うのが普通ではないでしょうか。
 
質問者様の追記を見て下記仕様と想定し、ソースコードを記載します。  
- FLGのチェックボックスがONのときのみテキストボックスA、B、Cの必須チェックを行う  
- チェックボックスがOFFの時はABCは非活性  
- Dだけは常に必須チェックを行う  
```C#
[Serializable]
public class TestModel : IValidatableObject
{
   public string Flg { get; set; }
   public string A { get; set; }
   public string B { get; set; }
   public string C { get; set; }
   [Required]  
   public string D { get; set; }
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
       if (this.Flg == "1")
       {
           if (string.IsNullOrEmpty(this.A))
           {
               yield return new ValidationResult("Aは入力が必須です。", new string[] { "A" });
           }
           if (string.IsNullOrEmpty(this.B))
           {
               yield return new ValidationResult("Bは入力が必須です。", new string[] { "C" });
           }
           if (string.IsNullOrEmpty(this.C))
           {
               yield return new ValidationResult("Cは入力が必須です。", new string[] { "B" });
           }
           if (string.IsNullOrEmpty(this.D))  
           {  
               yield return new ValidationResult("Dは入力が必須です。", new string[] { "D" });  
           }  
       }
   }
}
```
1 ソースコードの追記

workaholist

workaholist score 442

2017/06/15 19:31  投稿

条件付きの必須ということは、その条件のロジックを実装する必要があります。
つまりアノテーション1行では表現できないはずです。
従って、モデルにIValidatableObjectインターフェイスを実装してValidateメソッドで行うのが普通ではないでしょうか。
従って、モデルにIValidatableObjectインターフェイスを実装してValidateメソッドで行うのが普通ではないでしょうか。
```C#
[Serializable]
public class TestModel : IValidatableObject
{
   public string Flg { get; set; }
   public string A { get; set; }
   public string B { get; set; }
   public string C { get; set; }
   public string D { get; set; }
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
       if (this.Flg == "1")
       {
           if (string.IsNullOrEmpty(this.A))
           {
               yield return new ValidationResult("Aは入力が必須です。", new string[] { "A" });
           }
           if (string.IsNullOrEmpty(this.B))
           {
               yield return new ValidationResult("Bは入力が必須です。", new string[] { "C" });
           }
           if (string.IsNullOrEmpty(this.C))
           {
               yield return new ValidationResult("Cは入力が必須です。", new string[] { "B" });
           }
           if (string.IsNullOrEmpty(this.D))
           {
               yield return new ValidationResult("Dは入力が必須です。", new string[] { "D" });
           }
       }
   }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る