2016-05-24 4 views
0

フォームの検証を検証しようとしていますが、別のプロパティがtrueに設定されている場合にのみプロパティを検証したいと考えています。他のプロパティがtrueに設定されている場合、mvcデータアノテーションを使用してプロパティ値を検証する方法

私の二つの性質:

[DisplayName(Translations.Education.IsFeaturette)] 
public bool IsFeaturette { get; set; } 

[DisplayName(Translations.Education.AddFeaturetteFor)] 
[CusomValidatorForFeaturettes(IsFeaturette)] 
public string[] Featurettes { get; set; } 

カスタム注釈:

public class CusomValidatorForFeaturettes: ValidationAttribute 
{ 
    private readonly bool _IsFeatturette; 
    public CusomValidatorForFeaturettes(bool isFeatturette): base("NOT OK") 
    { 
     _IsFeatturette = isFeatturette; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value == null && _IsFeatturette) 
     { 
      var errorMessage = FormatErrorMessage(validationContext.DisplayName); 
      return new ValidationResult(errorMessage); 

     } 
     return ValidationResult.Success; 
    } 
} 

Basiclly isfeatureが真であるならば、Featurettesが値を持っている必要があります!

エラーイム取得:

オブジェクト参照が非静的フィールド、メソッドのために必要な、または プロパティ「EducationViewModel.IsFeaturette」が

私はcuzをこのプロパティは静的にすることはできませんされてこのプロパティはenityframeworkで設定されているため、これは私に問題をもたらしますが、私はこれを変更したくありません。プロパティを静的にしなくても、これをどのように達成できますか?

+0

[foolproof](http://foolproof.codeplex.com/)の条件付き属性を使用することを検討してください。クライアント側とサーバー側の両方の検証を行う[RequiredIfTrue]属性を含めるようにしてください。 –

+0

現時点ではフレームワークの使用を避けたいと考えています。あなたはこのように解決する方法を知っていますか? – ThunD3eR

+0

プロパティにパラメータとしてプロパティを渡すことはできません。 'other'プロパティの名前を示すには、 '[CusomValidatorForFeaturettes(" IsFeaturette ")]'のように 'string'(定数値) 。 –

答えて

2

属性はコンパイル時にアセンブリのメタデータに追加されるため、そのパラメータはコンパイル時に既知でなければなりません。このエラーは、プロパティの値(bool IsFeaturette)を静的でない属性(実行時にはtrueまたはfalse)に渡すために生成されます。

代わりに、比較するプロパティの名前を示す文字列を渡します。このメソッドでは、reflectionを使用してプロパティの値を取得します。

public bool IsFeaturette { get; set; } 

[CusomValidatorForFeaturettes("IsFeaturette")] 
public string[] Featurettes { get; set; } 

とあなたが、その後boolotherPropertyValueを変換して、条件付きのチェックを行うことができます

public class CusomValidatorForFeaturettes: ValidationAttribute 
{ 
    private readonly string _OtherProperty; 

    public CusomValidatorForFeaturettes(string otherProperty): base("NOT OK") 
    { 
     _OtherProperty = otherProperty; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     // Get the dependent property 
     var otherProperty = validationContext.ObjectInstance.GetType().GetProperty(_OtherProperty); 
     // Get the value of the dependent property 
     var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance, null); 
     ...... 

に検証属性を変更します。

IClientValidatableを実装する方法を含めて、検証属性を実装する方法をよりよく理解するために、The Complete Guide to Validation in ASP.NET-MVC-3 Part-2を読むことをお勧めします。これにより、サーバー側とクライアント側の両方の検証が行われます。また、何をしているのかをよりよく反映させるために、メソッドの名前をRequiredIfTrueAttributeに変更することをお勧めします。

foolproofには、MVCで使用するための有効な範囲の検証属性があることにも注意してください。

最後に、現在の実装は、1つのプロパティ(値IsFeaturette)に依存していますが、これは検証属性では意味がありません。コントローラの値をチェックする方が良いでしょう。 ModelStateErrorを追加してください。上記のコードは、バリデーション属性が許可すべきものである任意のプロパティ名(そのプロパティがtypeof boolである限り)を渡すことができることを意味します。

関連する問題