annotate Agendas/trunk/src/Agendas.Web/ModelMetadataWithDefaultsProvider.asax.cs @ 83:7e9ffde4022d

Implementando DataAnnotation desde recursos y por convención
author nelopauselli
date Tue, 24 May 2011 21:37:06 -0300
parents
children
rev   line source
83
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
1 using System;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
2 using System.Collections.Generic;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
3 using System.ComponentModel.DataAnnotations;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
4 using System.Linq;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
5 using System.Web.Mvc;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
6
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
7 namespace AltNetHispano.Agendas.Web
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
8 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
9 public class ModelMetadataWithDefaultsProvider : ModelMetadataProvider
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
10 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
11 private readonly DataAnnotationsModelMetadataProvider _base;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
12
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
13 public ModelMetadataWithDefaultsProvider(IModelMetadataResolver modelMetadataResolver)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
14 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
15 _base = new DataAnnotationsModelMetadataProviderWithAttributes(modelMetadataResolver);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
16 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
17
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
18 public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
19 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
20 return _base.GetMetadataForProperties(container, containerType);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
21 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
22
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
23 public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
24 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
25 var modelMetadata = _base.GetMetadataForProperty(modelAccessor, containerType, propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
26 return modelMetadata;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
27 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
28
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
29 public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
30 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
31 return _base.GetMetadataForType(modelAccessor, modelType);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
32 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
33 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
34
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
35 public class DataAnnotationsModelMetadataProviderWithAttributes : DataAnnotationsModelMetadataProvider
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
36 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
37 private readonly IModelMetadataResolver _modelMetadataResolver;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
38 private List<Attribute> _attributeList;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
39
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
40 public DataAnnotationsModelMetadataProviderWithAttributes(IModelMetadataResolver modelMetadataResolver)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
41 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
42 _modelMetadataResolver = modelMetadataResolver;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
43 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
44
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
45 protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
46 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
47 _attributeList = new List<Attribute>(attributes);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
48
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
49 var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
50
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
51 if (propertyName != null)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
52 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
53 if (string.IsNullOrWhiteSpace(modelMetadata.DisplayName))
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
54 modelMetadata.DisplayName = _modelMetadataResolver.GetDisplayName(propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
55
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
56 if (string.IsNullOrWhiteSpace(modelMetadata.Description))
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
57 modelMetadata.Description = _modelMetadataResolver.GetDescription(propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
58
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
59 var validators = _attributeList.OfType<ValidationAttribute>();
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
60 foreach (var validator in validators)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
61 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
62 if (string.IsNullOrWhiteSpace(validator.ErrorMessage) &&
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
63 string.IsNullOrWhiteSpace(validator.ErrorMessageResourceName))
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
64 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
65 var resourceName = propertyName + validator.GetType().Name;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
66 if (resourceName.EndsWith("Attribute"))
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
67 resourceName = resourceName.Substring(0, resourceName.Length - 9);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
68 var resourceType = validator.ErrorMessageResourceType ?? _modelMetadataResolver.ResourceType;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
69 var prop = resourceType.GetProperty(resourceName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
70 if (prop != null)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
71 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
72 validator.ErrorMessageResourceType = resourceType;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
73 validator.ErrorMessageResourceName = resourceName;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
74 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
75 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
76 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
77 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
78
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
79 return modelMetadata;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
80 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
81 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
82
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
83 public interface IModelMetadataResolver
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
84 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
85 string GetDisplayName(string propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
86 string GetDescription(string propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
87 Type ResourceType { get; }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
88 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
89
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
90 public class ModelMetadataLocalizable<T> : IModelMetadataResolver
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
91 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
92 public string GetDisplayName(string propertyName)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
93 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
94 return SearchResource(propertyName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
95 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
96
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
97 public string GetDescription(string propertyName)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
98 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
99 return SearchResource(propertyName + "Description");
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
100 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
101
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
102 public Type ResourceType
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
103 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
104 get { return typeof(T); }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
105 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
106
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
107 private static string SearchResource(string resourceName)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
108 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
109 string displayName = null;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
110 var resourceType = typeof(T);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
111 var prop = resourceType.GetProperty(resourceName);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
112 if (prop != null)
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
113 {
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
114 var value = prop.GetValue(resourceType, null);
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
115 displayName = value != null ? value.ToString() : resourceName;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
116 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
117 return displayName;
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
118 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
119
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
120 }
7e9ffde4022d Implementando DataAnnotation desde recursos y por convención
nelopauselli
parents:
diff changeset
121 }