ASP.NET MVC ModelMetaData:Есть ли способ установить IsRequired на основе RequiredAttribute?

StackOverflow https://stackoverflow.com/questions/1662442

Вопрос

Брэд Уилсон опубликовал отличную серию блогов о новом ModelMetaData ASP.NET MVC:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html

В нем он описывает, как класс ModelMetaData теперь отображается в представлениях и шаблонных помощниках.Мне хотелось бы отобразить звездочку рядом с меткой поля формы, если это поле является обязательным, поэтому я подумал об использовании свойства IsRequired ModelMetaData.Однако IsRequired по умолчанию истинно для всех свойств, не допускающих значения NULL, и ложно для всех свойств, допускающих значение NULL.Проблема в том, что строки всегда допускают значение NULL, поэтому свойство IsRequired для строк всегда имеет значение false.Кто-нибудь знает, как переопределить настройку IsRequired по умолчанию?В качестве альтернативы я подумал об использовании атрибута RequiredAttribute, которым я украшал свои свойства, но RequiredAttribute, похоже, не отображается через класс ModelMetaData.Кто-нибудь знает, как обойти эту проблему?

Заранее спасибо.

Это было полезно?

Решение

Вам необходимо создать свой собственный ModelMetadataProvider.Вот пример использования DataAnnotationsModelBinder.

public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
        protected override ModelMetadata CreateMetadata(Collections.Generic.IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
        {
            var _default = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
            _default.IsRequired = attributes.Where(x => x is RequiredAttribute).Count() > 0;
            return _default;
        }
}

Затем в вашем AppStartup в Global.asax вам нужно будет добавить следующее, чтобы подключить MyMetadataProvider в качестве поставщика метаданных по умолчанию:

ModelMetadataProviders.Current = new MyMetadataProvider();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top