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;
		}
	}
}