2011-10-19 16 views
3

いくつかの複雑な検証シナリオがあります。複雑な検証シナリオ

私はこのようになりますViewModelにあります、今

public class FooModel { 
    public class BarModel { 
     public string Name {get;set;} 
     public DateTime? BirthDate {get;set;} 
    } 

    public List<BarModel> Bars {get;set;} 

    // 10 BarModels added in controller 
    public FooModel() { Bars = new List<BarModel>(); } 

    public bool Choose1 {get;set;} 
    public bool Choose2 {get;set;} 
} 

をChoose1の値に応じて、私はChoose1がtrueの場合、すべてのBarModelさんは、データセット(必要な検証を)持っていることのいずれかvaludateする必要があり、またはChoose1がfalseの場合、リストの最初の2つの項目は無視されます。

第2に、Choose2がtrueの場合、Barsの各アイテムの生年月日を収集し、Nameプロパティを無視するだけです。

私はカスタム属性を見てきましたが、ネストされたクラスにそれを適用し、親クラスの値を取得する良い方法ではないようです。また、コレクション内の一部のアイテムだけを簡単に検証できる方法も見つけられませんでした。

提案がありますか?

EDIT:

私もIValidatableObject考えられてきましたが、私は、可能な場合にも、クライアント側で動作します溶液中で興味を持っています。他のオプションはありますか?

答えて

2

IValidatableObject

public class FooModel : IValidatableObject { 

public class BarModel { 
    public string Name {get;set;} 
    public DateTime? BirthDate {get;set;} 
} 

public List<BarModel> Bars {get;set;} 

// 10 BarModels added in controller 
public FooModel() { Bars = new List<BarModel>(); } 

public bool Choose1 {get;set;} 
public bool Choose2 {get;set;} 

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (Choose1) 
    { 
     // do your validation and return result if needed: 
     yield return new ValidationResult("The title is mandatory."); 
    } 
    // ... 
} 

} 
+0

を実装して独自の検証を書く私は、しかし、それは私が知っクライアント側の検証をサポートしていません、これを検討していました。 –

+1

あなたはクライアント側の検証が必要だと書いたことはありませんでしたが、あなたの状況では不可能だと思っています。これをアーカイブするにはサーバー側のViewModelが必要です。あなたはajaxでデータを送信することを検討し、検証結果をクライアントに返すことができます。 – Marc

関連する問題