Установка MaximumLength для StringLengthAttribute в коде - PullRequest
4 голосов
/ 22 августа 2011

Я работаю над кодом, который использует атрибуты DataAnnotation в моделях представления и программно переопределяет некоторые атрибуты при определенных обстоятельствах.

Изменение ErrorMessage на различные типы ValidationAttributes, без проблем.

Изменение DataFormatString на DisplayFormatAttributes, без проблем.

Изменение MinimumLength на StringLengthAttribute, без проблем. Но .. MaximumLength не имеет общего сеттера!?

Есть ли какая-то причина, по которой это свойство отличается наличием частного сеттера, когда все вокруг него общедоступно? Есть ли какое-либо решение, которое я могу использовать для программного изменения максимальной длины StringLengthAttribute?

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

Поскольку единственный публичный способ установить свойство MaximumLength - через конструктор атрибута, нет никакого программного способа изменить его после постстроения. Вы всегда можете использовать частное отражение, чтобы делать то, что вам нужно, при условии, что вы выполняете код с достаточным доверием. Если вы не хотите (или не можете) идти по этому пути, другим вариантом будет поменять модель представления при заданных условиях, а не просто обновить атрибуты по мере необходимости. Затем вы можете просто создать необходимый атрибут для каждой отдельной модели представления и не беспокоиться о программном изменении самого атрибута.

Последний вариант - написать собственный атрибут StringLength. Вы можете легко имитировать функциональность встроенной версии, поскольку ее метод IsValid() действительно прост:

public override bool IsValid(object value)
{
    int num = (value == null) ? 0 : ((string)value).Length;
    return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}

Подражая этому, но добавив сеттер public в свойство MaximumLength, вы получите то, что вам нужно.

1 голос
/ 22 августа 2011

Предполагая, что вы используете пользовательский ModelMetadataValidatorProvider, как я обрисовал в общих чертах на Как добавить атрибут проверки к свойству модели в TemplateEditor в MVC3 , в переопределении метода GetValidators вы можете выполнять итерацию по возвращенным валидаторам с помощью базового метода удалите текущий StringLengthAttribute и замените свой StringLengthAttribute желаемым значением MaxLength.

0 голосов
/ 22 августа 2011

Поскольку этот код относится к конкретной модели представления, пусть ваша ViewModel реализует интерфейс IValidateableObject и проверяет его там.


public IEnumerable Validate(ValidationContext validationContext)
{
    if (YourField.Length == 2)
    {
        yield return new ValidationResult("ut oh!!");
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...