ASP.NET MVC ModelMetadata: Existe uma maneira de definir IsRequired baseado no RequiredAttribute?

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

Pergunta

Brad Wilson postou uma grande série de posts sobre a nova ModelMetadata do ASP.NET MVC: http: //bradwilson.typepad .com / blog / 2009/10 / aspnet-mvc-2-templates-part-2-modelmetadata.html

Nela, ele descreve como a classe ModelMetadata está agora exposta nas vistas e ajudantes templated. O que eu gostaria de fazer é exibir um asterisco ao lado de um rótulo de campo de formulário se o campo é obrigatório, então eu pensei sobre como utilizar a propriedade IsRequired de ModelMetadata. No entanto, IsRequired por padrão é verdadeiro para todas as propriedades não anuláveis, enquanto ela é falsa para todas as propriedades anuláveis. O problema é que as cordas são sempre anulável, portanto, a propriedade IsRequired é sempre falsa para cordas. Alguém sabe como substituir o padrão de como IsRequired está definido? Alternativamente, eu pensei sobre alavancar o atributo RequiredAttribute que eu fui decorando minhas propriedades com, mas não o RequiredAttribute não parecem ser exposto através da classe ModelMetadata. Alguém sabe como contornar este problema?

Agradecemos antecipadamente.

Foi útil?

Solução

Você precisa criar seu próprio ModelMetadataProvider. Aqui está um exemplo usando o 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;
        }
}

Então em seu AppStartup no Global.asax, você vai querer colocar o seguinte para ligar a este MyMetadataProvider como o provedor de metadados padrão:

ModelMetadataProviders.Current = new MyMetadataProvider();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top