Получите охватывающий класс, затем получите доступ к свойству его внутри пользовательского атрибута - PullRequest
3 голосов
/ 23 января 2010

Я использую ASP.NET MVC и выполняю настраиваемую проверку с помощью настраиваемых атрибутов / аннотаций данных на моих моделях.

Возможно ли получить доступ к свойству родительского класса объекта внутри моего настраиваемого атрибута?

public class MyModel
{
    [MyCustomValidator]
    public string var1 {get; set;}
    public string var2 {get; set;}
}

Примечание. Использование asp.net mvc

public class MyCustomValidatorAttribute : ValidationAttribute
{
    public bool override IsValid(Object value)
    {  
          // somehow get access to var2 in the MyModel
    }
}

Таким образом, при проверке правильности проверяется другое свойство на предмет определенного значения.Я пытался передать значение var2 в качестве параметра MyCustomValidator, но это не сработало.

Ответы [ 3 ]

3 голосов
/ 23 января 2010

Нет, в основном. После поиска через отражатель у вас есть доступ только к значению проверяемого элемента, но не к содержащему объекту или даже к информации об элементе свойства / поля / чего бы то ни было.

То, что я согласен, очень ограничивает и расстраивает, но похоже, что это исправлено в 4.0 - мой предыдущий ответ намекнул на это, но в 4.0 есть IsValid перегрузка, которая принимает ValidationContext, которая предоставляет эту информацию через ObjectInstance.

1 голос
/ 31 января 2010

Очевидно, что MVC 2 Validation не поддерживает validationContext, потому что MVC 2 нацелен на DA 3.5. Я не уверен, что это по-прежнему в случае MVC 2 RC, я использую VS 2010 с MVC 2 Preview 1.

Взято с поста Брэда Уилсона в http://forums.asp.net/p/1457591/3650720.aspx

В версии DataAnnotations 3.5 с пакетом обновления 1 отсутствует контекст проверки, который предназначен для MVC 2. Атрибут [CustomValidation] также является артефактом DA4.0, поэтому для написания пользовательской проверки необходимо создать новый атрибут проверки, полученный из ValidationAttribute

0 голосов
/ 24 ноября 2010

Просто обратите внимание, что вы можете сделать это с MVC3:

public class MyCustomValidatorAttribute : ValidationAttribute
{
    public bool override IsValid(Object value)
    {  
          var model = validationContext.ObjectInstance as MyModel; 
          // would probably use reflection and pass property names instead of casting in real life

          if (model.var2 != null && value == null)
          {
            return new ValidationResult("var1 is required when var2 is set");
          }

          return ValidationResult.Success;
    }
}
...