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

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

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

Спасибо заранее.

Ответы

Ответ 1

Вам нужно создать свой собственный 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();