如何在两个视图模型中检查自定义注释?

时间:2014-02-20 22:24:07

标签: c# asp.net-mvc data-annotations

所以我有下面的模型,我正在尝试创建自定义数据注释来验证我的数据。这是一个RequiredIf()。第一个参数是属性名称,第二个参数是属性名称应该等于的内容。

我要做的是让它查看QuestionViewModel QuestionType并查看它是否为“text”,如果是,那么此字段是必需的。但我在QuestionOptionViewModel内,我不确定如何创建一个将访问QuestionViewModel的注释?

因此,如果您注意到以下逻辑在QuestionViewModel上运行良好。但不是当我在QuestionOptionViewModel里面时。如何访问requiredIf类中另一个viewmodel中的属性?

模型:

  public class QuestionViewModel
        {
            public int? Id { get; set; }

            public string QuestionType { get; set; }

            public string SubType { get; set; }

            public string Text { get; set; }

            public int SortOrder { get; set; }

            public bool IsHidden { get; set; }

            [RequiredIf("QuestionType", "radio", ErrorMessage = "Radio Reqired")]
            public int? Selected { get; set; }

            public List<QuestionOptionViewModel> Options { get; set; }

        }

    public class QuestionOptionViewModel
        {
            public int? Id { get; set; }

            public string Text { get; set; }

            [RequiredIf("QuestionType", "text", ErrorMessage = "Required Field")]
            public string Value { get; set; }

            public bool IsChecked { get; set; }
        }

定制数据注释:

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

        public RequiredIfAttribute(String propertyName, Object desiredValue)
        {
            PropertyName = propertyName;
            DesiredValue = desiredValue;
        }

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

2 个答案:

答案 0 :(得分:0)

尝试“QuestionViewModel.QuestionType”

答案 1 :(得分:0)

在我看来,即使通过反思也无法知道。 请考虑以下情形:

QuestionViewModel qvm1 = new QuestionViewModel();
QuestionViewModel qvm2 = new QuestionViewModel();

List<QuestionOptionViewModel> qovm = new List<QuestionOptionViewModel>();

qvm1.Options = qovm;
qvm2.Options = qovm;

这就是为什么无法获取包含该问题的QuestionViewModel实例的原因,因为可以有多个QuestionViewModel引用指向同一个List对象。