annotate Agendas/trunk/src/Agendas.Web/CustomModelMetadataProvider/DataAnnotationAndConventionModelMetadataProvider.cs @ 103:23325dddddcc

Persistencia del estado de los eventos
author jorge.rowies
date Sun, 05 Jun 2011 13:06:23 -0300
parents 8a4135f019dd
children c57ca21064f2
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
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
33 var validators = _attributeList.OfType<ValidationAttribute>();
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
34 foreach (var validator in validators)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
35 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
36 if (string.IsNullOrWhiteSpace(validator.ErrorMessage) &&
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
37 string.IsNullOrWhiteSpace(validator.ErrorMessageResourceName))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
38 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
39 var resourceName = propertyName + validator.GetType().Name;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
40 if (resourceName.EndsWith("Attribute"))
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
41 resourceName = resourceName.Substring(0, resourceName.Length - 9);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
42 var resourceType = validator.ErrorMessageResourceType ?? _resolverByConvention.ResourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
43 var prop = resourceType.GetProperty(resourceName);
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
44 if (prop != null)
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
45 {
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
46 validator.ErrorMessageResourceType = resourceType;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
47 validator.ErrorMessageResourceName = resourceName;
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
48 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
49 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
50 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
51 }
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
52
8a4135f019dd cambio de nombre de una clase
nelopauselli
parents:
diff changeset
53 return modelMetadata;
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 }