Можно ли изменить аннотации данных во время выполнения?(ASP.NET MVC [Диапазон] [Требуется] [StringLength] и т. Д.) - PullRequest
5 голосов
/ 03 ноября 2010

Как правило, проверка ModelBinding для члена класса может выполняться следующим образом:

public Class someclass
{
    [StringLength(50)]
    public string SomeValue { get; set; }
}

Максимальное значение SomeValue ограничено 50 символами.

Возможно ли иметь константу(50) изменилось на что-то другое во время выполнения, скажем, во время конструирования каждого экземпляра этого класса, так что можно иметь различные экземпляры с разными ограничениями StringLength?

Если так, то каксделать это?

1 Ответ

13 голосов
/ 03 ноября 2010

Да. Но единственный способ - создать собственную реализацию DataAnnotationsModelValidatorProvider, а затем зарегистрировать ее в Global.ascx.cs. Вы не можете просто удалить атрибуты во время выполнения, НО прерывают внутренние компоненты MVC, которые их читают:

public class ConventionModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {
        List<Attribute> newAttributes = new List<Attribute>(attributes);
        if( mycondition == true )
        {
            //get rid of the existing attribute
            newAttributes.Remove(newAttributes.OfType<StringLengthAttribute>().First());


            //add a new one 
            newAttributes.Add( new StringLengthAttribute(5324));
        }

        return base.GetValidators(metadata, context, newAttributes);
    }
}

Регистрация:

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add( new CustomValidatorProvider() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...