1

MVCのカスタム検証を使用して別のフィールドに基づいてフィールドを検証していますが、この実装に出くわしました。

 public class RequiredIfAttribute : ValidationAttribute
    {
        private String PropertyName { get; set; }
        private String ErrorMessage { get; set; }
        private Object DesiredValue { get; set; }

        public RequiredIfAttribute(String propertyName, Object desiredvalue, String errormessage)
        {
            this.PropertyName = propertyName;
            this.DesiredValue = desiredvalue;
            this.ErrorMessage = errormessage;
        }

        protected override ValidationResult IsValid(object value, ValidationContext context)
        {
            Object instance = context.ObjectInstance;
            Type type = instance.GetType();
            Object proprtyvalue = type.GetProperty(PropertyName).GetValue(instance, null);
            if (proprtyvalue.ToString() == DesiredValue.ToString())
            {
                return new ValidationResult(ErrorMessage);
            }
            return ValidationResult.Success;
        }
    }

そして、私は次のように定義された単純なクラスを持っています:

public class Person
{
    public int PersonID { get; set; }
    public string name { set; get; }
    [RequiredIf("name","","Address is required")]
    public string addr { get; set; }
}

ページを実行するとObject reference not set to an instance of an object.エラーが発生しますが、行を変更する[RequiredIf("name","John","Address is required")]と期待どおりの結果が得られます。私の質問は、フィールドが空かどうかを確認するためにどのように使用するかです。

行をに変更しようとしまし[RequiredIf("name",null,"Address is required")]たが、同じエラーが発生します。

4

2 に答える 2

2

これはうまくいくようです:

protected override ValidationResult IsValid(object value, ValidationContext context)
        {
            if (value != null) { return ValidationResult.Success; }

            Object instance = context.ObjectInstance;
            Type type = instance.GetType();
            Object proprtyvalue = type.GetProperty(PropertyName).GetValue(instance, null);
            if (proprtyvalue == null) {
               return new ValidationResult(ErrorMessage);
            }
            return ValidationResult.Success;
        }
于 2013-02-22T21:38:54.207 に答える
0

テストしている実際のPersonインスタンス化を投稿しなかったので、推測しています。ToString ()を呼び出す前に、PropertyNameのproprtyvalueがnullでないことを確認してください。したがって、Person.Nameをnullにすることはできません。

于 2013-02-22T20:12:59.110 に答える