Mercurial > altnet-hispano
view Agendas/trunk/src/Agendas.Web/CustomModelMetadataProvider/DataAnnotationAndConventionModelMetadataProvider.cs @ 286:a8f7c41e3b47
#196: Patrocinadores, en el histórico de eventos.
author | juanjose.montesdeocaarbos |
---|---|
date | Mon, 02 Jan 2012 15:51:19 -0300 |
parents | ea85bd893247 |
children | 8b0c62c255cd |
line wrap: on
line source
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web.Mvc; namespace AltNetHispano.Agendas.Web.CustomModelMetadataProvider { public class DataAnnotationAndConventionModelMetadataProvider : DataAnnotationsModelMetadataProvider { private readonly IResolverByConvention _resolverByConvention; private List<Attribute> _attributeList; public DataAnnotationAndConventionModelMetadataProvider(IResolverByConvention resolverByConvention) { _resolverByConvention = resolverByConvention; } protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) { _attributeList = new List<Attribute>(attributes); var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); if (propertyName != null) { // Si no hay displayName asignado, lo buscamos entre los recursos if (string.IsNullOrWhiteSpace(modelMetadata.DisplayName)) modelMetadata.DisplayName = _resolverByConvention.GetDisplayName(propertyName); // Si no hay description asignado, lo buscamos entre los recursos if (string.IsNullOrWhiteSpace(modelMetadata.Description)) modelMetadata.Description = _resolverByConvention.GetDescription(propertyName); // Auto UIHint por property name. // TODO: Sería ideal chequear si existe el template antes de asignarlo, ¿cómo? if (string.IsNullOrWhiteSpace(modelMetadata.TemplateHint)) modelMetadata.TemplateHint = propertyName; // Para cada validador sin texto asignado, tomamos asignamos los valores para ser buscados // entre los recursos var validators = _attributeList.OfType<ValidationAttribute>(); foreach (var validator in validators) { if (string.IsNullOrWhiteSpace(validator.ErrorMessage) && string.IsNullOrWhiteSpace(validator.ErrorMessageResourceName)) { var resourceName = propertyName + validator.GetType().Name; if (resourceName.EndsWith("Attribute")) resourceName = resourceName.Substring(0, resourceName.Length - 9); var resourceType = validator.ErrorMessageResourceType ?? _resolverByConvention.ResourceType; var prop = resourceType.GetProperty(resourceName); if (prop != null) { validator.ErrorMessageResourceType = resourceType; validator.ErrorMessageResourceName = resourceName; } } } } return modelMetadata; } } }