annotate Agendas/trunk/src/Agendas.Web/CustomModelMetadataProvider/DataAnnotationAndConventionModelMetadataProvider.cs @ 300:48ab8788bd19

#200: Patrocinadores: Agregar link al sitio web.
author juanjose.montesdeocaarbos
date Mon, 27 Feb 2012 14:45:12 -0300
parents 8b0c62c255cd
children
rev   line source
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
1 using System;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
2 using System.Collections.Generic;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
3 using System.ComponentModel.DataAnnotations;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
4 using System.Linq;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
5 using System.Web.Mvc;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
6
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
7 namespace AltNetHispano.Agendas.Web.CustomModelMetadataProvider
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
8 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
9 public class DataAnnotationAndConventionModelMetadataProvider : DataAnnotationsModelMetadataProvider
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
10 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
11 private readonly IResolverByConvention _resolverByConvention;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
12 private List<Attribute> _attributeList;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
13
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
14 public DataAnnotationAndConventionModelMetadataProvider(IResolverByConvention resolverByConvention)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
15 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
16 _resolverByConvention = resolverByConvention;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
17 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
18
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
19 protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType,
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
20 Func<object> modelAccessor, Type modelType, string propertyName)
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
21 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
22 _attributeList = new List<Attribute>(attributes);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
23
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
24 var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
25
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
26 if (propertyName != null)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
27 {
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
28 // Si no hay displayName asignado, lo buscamos entre los recursos
289
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
29 // Primero lo buscarmos por el Assembly FullName y el propertyName
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
30 // Si no lo encuentra, buscamos por el propertyName unicamente
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
31 if (string.IsNullOrWhiteSpace(modelMetadata.DisplayName))
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
32 {
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
33 if (containerType != null && containerType.FullName != null)
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
34 modelMetadata.DisplayName =
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
35 _resolverByConvention.GetDisplayName(string.Format("{0}{1}", containerType.FullName.Replace(".", string.Empty),
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
36 propertyName));
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
37 }
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
38 if (string.IsNullOrWhiteSpace(modelMetadata.DisplayName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
39 modelMetadata.DisplayName = _resolverByConvention.GetDisplayName(propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
40
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
41 // Si no hay description asignado, lo buscamos entre los recursos
289
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
42 // Primero lo buscarmos por el Assembly FullName y el propertyName
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
43 // Si no lo encuentra, buscamos por el propertyName unicamente
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
44 if (string.IsNullOrWhiteSpace(modelMetadata.Description))
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
45 {
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
46 if (containerType != null && containerType.FullName != null)
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
47 modelMetadata.Description =
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
48 _resolverByConvention.GetDescription(string.Format("{0}{1}", containerType.FullName.Replace(".", string.Empty),
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
49 propertyName));
8b0c62c255cd Se modifica DataAnnotationAndConventionModelMetadataProvider.cs para que lea Recursos en base al Assembly Fullname
juanjose.montesdeocaarbos
parents: 167
diff changeset
50 }
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
51 if (string.IsNullOrWhiteSpace(modelMetadata.Description))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
52 modelMetadata.Description = _resolverByConvention.GetDescription(propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
53
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
54 // Auto UIHint por property name.
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
55 // TODO: Sería ideal chequear si existe el template antes de asignarlo, ¿cómo?
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
56 if (string.IsNullOrWhiteSpace(modelMetadata.TemplateHint))
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
57 modelMetadata.TemplateHint = propertyName;
152
c57ca21064f2 Auto UIHint por el nombre de la propiedad, hay un TODO para mejorarlo
Nelo@Guinea.neluz.int
parents: 85
diff changeset
58
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
59 // Para cada validador sin texto asignado, tomamos asignamos los valores para ser buscados
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
60 // entre los recursos
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
61 var validators = _attributeList.OfType<ValidationAttribute>();
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
62 foreach (var validator in validators)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
63 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
64 if (string.IsNullOrWhiteSpace(validator.ErrorMessage) &&
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
65 string.IsNullOrWhiteSpace(validator.ErrorMessageResourceName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
66 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
67 var resourceName = propertyName + validator.GetType().Name;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
68 if (resourceName.EndsWith("Attribute"))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
69 resourceName = resourceName.Substring(0, resourceName.Length - 9);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
70 var resourceType = validator.ErrorMessageResourceType ?? _resolverByConvention.ResourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
71 var prop = resourceType.GetProperty(resourceName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
72 if (prop != null)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
73 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
74 validator.ErrorMessageResourceType = resourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
75 validator.ErrorMessageResourceName = resourceName;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
76 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
77 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
78 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
79 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
80
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
81 return modelMetadata;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
82 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
83 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
84 }