3


0

クラスレベルの検証

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx [DataAnnotations] utilsを使用してクラスを検証しています。

Title`プロパティと Item`プロパティを持つクラスがあります。 http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx [RequiredAttribute]を` Title`プロパティに適用したいのですが、 ` Item`プロパティはnullです。オブジェクトに Item`プロパティが設定されている場合、 Title`は必要ありません。

要するに、クラスの条件が満たされた場合にのみhttp://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx [RequiredAttribute]を検証する必要があります。

どうすればこれができますか。

更新

私は他の方法を見つけられなかったので、そして私は通常この機能をそれほど頻繁に必要としないので、クラスレベルのバリデータを使用して大まかな方法​​にすることにしました。 私の質問は、UIを手動で更新して、タイトルフレームに赤いフレームを付ける方法、つまり 無効にするには?

  • Update 2 * +クラスレベルのバリデーターにフィールドの要約を作成したい。 たとえば、CostフィールドとSalesPriceフィールドを使用する必要があります。SalesPrice> Costを確認し、それ以外の場合はSalesPriceを無効にします。クラスレベルでのグローバル検証エラーは望ましくありません。

私はそれをxamlyな方法で行うことを好みます。

2 Answer


6


これを行うには、クラスのカスタム検証属性を作成します。 残念ながら、プロパティに割り当てられたDataAnnotation属性は、クラスバリデータを作成する必要があることを知っている限り、親クラスの他のプロパティにアクセスできません。 + System.ComponentModel.DataAnnotations名前空間を使用して、ValidationAttributeから継承するカスタム属性クラスを作成し、IsValidメソッドをオーバーライドする必要があります(以下のコードはテストしていませんが、うまくいくはずです)。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
sealed public class CustomAttribute: ValidationAttribute
{
  public CustomAttribute()
  {
  }

  public override bool IsValid(object value)
  {
     if(value is myClass)
     {
       return ((myClass)value).Item != null &&
         string.IsNullOrEmpty(((myClass)value).Title) ? false : true;
     }
     else return true;
  }
}

もう少し掘り下げてみると、クロスフィールド検証はそのままでは不可能であるように見えますが、フレームワークを拡張してサポートすることで実現できます。 http://blogs.msdn.com/b/mikeormond/archive/2010/10/05/extending-asp-net-mvc-s-validation.aspx [詳細についてはこの記事]を参照してください。将来的に追加されることを願っていますMVCのバージョン。


0


まあ、プロパティレベルで条件付き検証をMVCで達成することは困難です。 しかし、フレームワークを拡張したり、他のライブラリを使用して目標を達成したりできます。 私のプロジェクトでの条件付き検証のために、ニックによる確実な検証を使用しています。 あなたはそれを見ることができますhttp://foolproof.codeplex.com/ [こちら]