6

一部のロジックでは、モデルのプロパティを反復処理してプロパティを自動バインドする必要があり、機能を拡張して C# 4.0 の新しいデータ注釈を含めたいと考えています。

現時点では、基本的に、すべての ValidationAttribute インスタンスに読み込まれている各プロパティを繰り返し処理し、Validate/IsValid 関数を使用して検証しようとしていますが、これはうまくいかないようです。

例として、次のようなモデルがあります。

public class HobbyModel
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "Do not allow empty strings")]
    [DisplayName("Hobby")]
    [DataType(DataType.Text)]
    public string Hobby
    {
        get;
        set;
    }
}

属性をチェックするコードは次のとおりです。

object[] attributes = propertyInfo.GetCustomAttributes(true);
TypeConverter typeConverter =
TypeDescriptor.GetConverter(typeof(ValidationAttribute));

bool isValid = false;
foreach (object attr in attributes)
{
   ValidationAttribute attrib = attr as ValidationAttribute;

   if (attrib != null)
   {
     attrib.Validate(obj, propertyInfo.Name);
   }
}

コードをデバッグしたところ、モデルには 3 つの属性があり、そのうちの 2 つは ValidationAttribute から派生していますが、コードが Validate 関数を (空または null 値で) 通過すると、期待どおりに例外がスローされます。

私はばかげたことをしていると思っているので、誰かがこの機能を使用して助けてくれるかどうか疑問に思っています.

前もって感謝します、ジェイミー

4

2 に答える 2

4

クラスを使用してSystem.ComponentModel.DataAnnotations.Validatorオブジェクトを検証します。

于 2010-12-13T08:11:37.197 に答える
4

これはValidate、プロパティ値ではなく、ソース オブジェクトをメソッドに渡すためです。以下は、期待どおりに機能する可能性が高くなります (ただし、インデックス付きプロパティの場合は明らかにそうではありません)。

attrib.Validate(propertyInfo.GetValue(obj, null), propertyInfo.Name);

ただし、スティーブンが提案したように、Validator クラスを使用すると、確かに簡単になります。

于 2012-04-27T16:39:03.783 に答える