Как я могу получить экземпляр связанного объекта атрибута? - PullRequest
2 голосов
/ 07 апреля 2010

Я пишу PropertiesMustMatch проверочный атрибут, который может принимать имя свойства строки в качестве параметра. Я бы хотел найти соответствующее свойство по имени для этого объекта и сделать сравнение базового равенства. Какой лучший способ получить к этому доступ через отражение?

Кроме того, я извлек блок приложения Validation в Enterprise Library и решил, что его PropertyComparisonValidator слишком интенсивен для того, что нам нужно.

ОБНОВЛЕНИЕ: Для дальнейшего разъяснения (для обеспечения некоторого контекста) целью является просто проверка, которая обеспечивает сопоставление полей (например, проверка пароля). Мы бы хотели, чтобы он работал с аннотациями данных атрибутов уровня свойств, которые наследуются от класса ValidationAttribute, если это возможно.

ОБНОВЛЕНИЕ: На случай, если кому-то будет любопытно, я решил реальную бизнес-проблему с помощью настройки кода, предоставленного в ответ на этот вопрос

Ответы [ 3 ]

4 голосов
/ 07 апреля 2010

Вы не можете, в основном. Код, который проверяет объект на наличие атрибута, должен также взять на себя ответственность за сообщение любому коду, какой тип / объект он просматривал. Вы не можете получить дополнительные метаданные из внутри атрибута.

1 голос
/ 07 апреля 2010

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

0 голосов
/ 21 июня 2016

Вы можете что-то вроде этого.

//target class
public class SomeClass{

  [CustomRequired(ErrorMessage = "{0} is required", ProperytName = "DisplayName")]
  public string Link { get; set; }

  public string DisplayName { get; set; }
}
//custom attribute
public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
  public string ProperytName { get; set; }

  public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
  {
    var propertyValue = "Value";
    var parentMetaData = ModelMetadataProviders.Current
         .GetMetadataForProperties(context.Controller.ViewData.Model, context.Controller.ViewData.Model.GetType());
    var property = parentMetaData.FirstOrDefault(p => p.PropertyName == ProperytName);
    if (property != null)
        propertyValue = property.Model.ToString();

    yield return new ModelClientValidationRule
    {
        ErrorMessage = string.Format(ErrorMessage, propertyValue),
        ValidationType = "required"
    };
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...