annotate Agendas/trunk/src/Agendas.Web/CustomModelMetadataProvider/DataAnnotationAndConventionModelMetadataProvider.cs @ 155:23aaf98b8377

Generalizando editores en EditorDefault basando los textos en recursos
author Nelo@Guinea.neluz.int
date Wed, 03 Aug 2011 09:38:23 -0300
parents c57ca21064f2
children ea85bd893247
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
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
19 protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
20 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
21 _attributeList = new List<Attribute>(attributes);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
22
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
23 var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
24
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
25 if (propertyName != null)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
26 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
27 if (string.IsNullOrWhiteSpace(modelMetadata.DisplayName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
28 modelMetadata.DisplayName = _resolverByConvention.GetDisplayName(propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
29
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
30 if (string.IsNullOrWhiteSpace(modelMetadata.Description))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
31 modelMetadata.Description = _resolverByConvention.GetDescription(propertyName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
32
152
c57ca21064f2 Auto UIHint por el nombre de la propiedad, hay un TODO para mejorarlo
Nelo@Guinea.neluz.int
parents: 85
diff changeset
33 // Auto UIHint por property name.
c57ca21064f2 Auto UIHint por el nombre de la propiedad, hay un TODO para mejorarlo
Nelo@Guinea.neluz.int
parents: 85
diff changeset
34 // TODO: Sería ideal chequear si existe el template antes de asignarlo, ¿cómo?
c57ca21064f2 Auto UIHint por el nombre de la propiedad, hay un TODO para mejorarlo
Nelo@Guinea.neluz.int
parents: 85
diff changeset
35 if (string.IsNullOrWhiteSpace(modelMetadata.TemplateHint))
c57ca21064f2 Auto UIHint por el nombre de la propiedad, hay un TODO para mejorarlo
Nelo@Guinea.neluz.int
parents: 85
diff changeset
36 modelMetadata.TemplateHint = propertyName;
c57ca21064f2 Auto UIHint por el nombre de la propiedad, hay un TODO para mejorarlo
Nelo@Guinea.neluz.int
parents: 85
diff changeset
37
85
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
38 var validators = _attributeList.OfType<ValidationAttribute>();
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
39 foreach (var validator in validators)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
40 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
41 if (string.IsNullOrWhiteSpace(validator.ErrorMessage) &&
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
42 string.IsNullOrWhiteSpace(validator.ErrorMessageResourceName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
43 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
44 var resourceName = propertyName + validator.GetType().Name;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
45 if (resourceName.EndsWith("Attribute"))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
46 resourceName = resourceName.Substring(0, resourceName.Length - 9);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
47 var resourceType = validator.ErrorMessageResourceType ?? _resolverByConvention.ResourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
48 var prop = resourceType.GetProperty(resourceName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
49 if (prop != null)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
50 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
51 validator.ErrorMessageResourceType = resourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
52 validator.ErrorMessageResourceName = resourceName;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
53 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
54 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
55 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
56 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
57
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
58 return modelMetadata;
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 }