Mercurial > altnet-hispano
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 } |