2016-04-19 17 views
0

プロパティの検証に関する質問がありますが、まだ適切な回答を見つけることができませんでした。他のモデルプロパティに基づいてプロパティ値を検証する

私は、次のクラス

public class IndexViewModel 
{ 
    public Film Film { get; set; } 

    public ReviewModel Review { get; set; } 
} 

public class ReviewModel 
{ 
    [RequiredIf // only fire if 'Genre' is equal to Genre.Horror] 
    public string Text { get; set; } 
} 

public class Film 
{ 
    public string Title { get; set; } 
    public Director Director { get; set; } 
    public Genre Genre { get; set; } 
} 

public class Director 
{ 
    public string Name { get; set; } 
} 

public enum Genre 
{ 
    Horror, 
    Thriller, 
    SciFi, 
    Drama 
} 

を持っているがFilmモデルでGenreの値に基づいて検証を発射ReviewModelText性質上[RequiredIf]属性を追加することが可能です。どんな助けでも大歓迎です。

+0

Foolproof Validation:https://foolproof.codeplex.com/とFluentValidation:https://github.com/JeremySkinner/FluentValidation – solidau

+0

検証コンテキストは「ReviewModel」用であるため、検証属性を使用することはできません'のみです。しかし、あなたの 'IndexViewModel'はビューモデルの正しい使い方ではありません。これには、フラットな構造として編集する必要のあるプロパティが含まれている必要があります。また、データモデルであるプロパティを含むべきではありません。 –

答えて

2

検証する必要があるプロパティが関連付けられているクラスにない場合は、検証属性の使用をお勧めしません。私はRequiredIfAttributeのようなモデルを横断する実装を見ていません。 (Here's a good one from a different question.

IValidatableObjectの簡単な実装についてはどうですか?それは非常に明確で、MVCはモデルを構築するときにそれをチェックします。

public class IndexViewModel : IValidatableObject 
{ 
    public Film Film { get; set; } 

    public ReviewModel Review { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (Film.Genre == Genre.Horror && string.IsNullOrWhiteSpace(Review.Text)) 
     { 
      yield return new ValidationResult(
       "Please provide a review for this film.", 
       new string[] { nameof(Review.Text) }); 
     } 
    } 
} 
0

あなたのビジネス層でそれを入れてください。

[RequiredIf // only fire if 'Genre' is equal to Genre.Horror 

]

あなたのモデルにそれを置く必要がある場合は、あなたにも

System.ComponentModel.IValidatableObject 

を実装し、それを検証するためにObjectValidatorを使用する場合があります。

経験に基づいて、asp.net MVCが有効になり、サービスレイヤーに重要なビジネスルールをダンプできるように、私はRequiredやStringLengthなどの基本的な属性の装飾を行います。データベースへの追加呼び出しのような外部データ要素を必要とすることはめったにありません。

実際の使用状況によって異なります。私は、データの移動が予想され、したがって検証ロジックがシリアル化、つまりJSONのシリアル化中に失われることが予想されるため、私のデータクラスをダムに保つのが好きです。

関連する問題