ASP.NET MVC ModelMetaData: есть ли способ установить IsRequired на основе RequiredAttribute?
Брэд Уилсон опубликовал замечательную серию блогов о новой ModelMetaData в ASP.NET MVC: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html
В нем он описывает, как класс ModelMetaData теперь отображается в представлениях и шаблонных помощниках. То, что я хотел бы сделать, это отобразить звездочку рядом с меткой поля формы, если поле является обязательным, поэтому я подумал об использовании свойства IsRequired ModelMetaData. Однако IsRequired по умолчанию имеет значение true для всех ненулевых свойств, в то время как значение false для всех обнуляемых свойств. Проблема в том, что строки всегда обнуляются, поэтому свойство 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();