2017-09-19 10 views
2

予測されるように、検証属性のセット・エラー・メッセージが表示されていない、私はカスタム検証属性を持っている:カスタム

public class RequireIfPropertyIsFalseAttribute : ValidationAttribute 
    { 
     private string basisProperty { get; set; } 
     public RequireIfPropertyIsFalseAttribute(string basisProperty) 
     { 
      this.basisProperty = basisProperty; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var basisProp = validationContext.ObjectType.GetProperty(basisProperty); 
      var isFalse = !(bool)basisProp.GetValue(validationContext.ObjectInstance, null); 

      if (isFalse) 
      { 
       if (value == null || (value.GetType() == typeof(string) && string.IsNullOrEmpty(((string)value).Trim()))) 
         return new ValidationResult(this.ErrorMessage); 
      } 

      return ValidationResult.Success; 
     } 
    } 

を私は両方のモデルの特性のためにそれを使用します。

public bool NoAgeProvided { get; set; } 
[RequireIfPropertyIsFalse(nameof(NoAgeProvided), ErrorMessage = "This is required")] 
[Display(Name = "Age")] 
public int Age { get; set; } 

public bool NoNameProvided { get; set; } 
[RequireIfPropertyIsFalse(nameof(NoNameProvided), ErrorMessage = "This is required")] 
[Display(Name = "Name")] 
public string Name { get; set; } 

検証すると、名前の検証メッセージショー"これは必須です"。ただし、Ageプロパティでは、検証メッセージに「Ageフィールドは必須です」と表示されます。私は間違って何をしていますか? ErrorMessageをどのように表示できますか?

答えて

1

プロパティAgeがtypeof演算intあるので、それが常に必要です(intnullすることはできません)、あなたはテキストボックスが空のままにしておくと、null値が送信され、必要な検証が最初に実行され、そのエラーメッセージが表示されます。

変更あなたはそのstringデフォルトではNULL可能であるので、それはあなたのName財産のために働くことをNULL可能

public int? Age { get; set; } 

注意するプロパティ。

IClientValidatableを実装することを検討して、クライアント側の検証も取得できるようにする必要があります。 The Complete Guide To Validation In ASP.NET MVC 3 - Part 2を参照してください。

+0

私はそれが事実だと思いました。しかし、フィールドをNULL値にすることは、関連するデータベーステーブルのカラムがnull属性でなければならないことを意味します。私はあなたが提供したリンクを読むでしょう。どうもありがとうございます! – TambaySaPinas

+0

ビューのデータモデルではなく、ビューモデルを常に使用するように、データを編集します。 –

+0

いずれにしても、dbカラムに何も格納されていないと値が0になっても、それは意味がありません。 –

関連する問題