annotate 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
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
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
29 if (string.IsNullOrWhiteSpace(modelMetadata.DisplayName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
30 modelMetadata.DisplayName = _resolverByConvention.GetDisplayName(propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
31
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
32 // Si no hay description asignado, lo buscamos entre los recursos
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
33 if (string.IsNullOrWhiteSpace(modelMetadata.Description))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
34 modelMetadata.Description = _resolverByConvention.GetDescription(propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
35
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
36 // Auto UIHint por property name.
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
37 // TODO: Sería ideal chequear si existe el template antes de asignarlo, ¿cómo?
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
38 if (string.IsNullOrWhiteSpace(modelMetadata.TemplateHint))
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
39 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
40
167
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
41 // Para cada validador sin texto asignado, tomamos asignamos los valores para ser buscados
ea85bd893247 Ajustes menores de UI
nelopauselli
parents: 152
diff changeset
42 // entre los recursos
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
43 var validators = _attributeList.OfType<ValidationAttribute>();
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
44 foreach (var validator in validators)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
45 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
46 if (string.IsNullOrWhiteSpace(validator.ErrorMessage) &&
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
47 string.IsNullOrWhiteSpace(validator.ErrorMessageResourceName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
48 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
49 var resourceName = propertyName + validator.GetType().Name;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
50 if (resourceName.EndsWith("Attribute"))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
51 resourceName = resourceName.Substring(0, resourceName.Length - 9);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
52 var resourceType = validator.ErrorMessageResourceType ?? _resolverByConvention.ResourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
53 var prop = resourceType.GetProperty(resourceName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
54 if (prop != null)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
55 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
56 validator.ErrorMessageResourceType = resourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
57 validator.ErrorMessageResourceName = resourceName;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
58 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
59 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
60 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
61 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
62
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
63 return modelMetadata;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
64 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
65 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
66 }