Merge pull request #249 from pcc/xgetinputfocus
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / DataAnnotationsModelMetadata.cs
1 namespace System.Web.Mvc {
2     using System;
3     using System.ComponentModel.DataAnnotations;
4     using System.Globalization;
5     using System.Reflection;
6     using System.Web.Mvc.Resources;
7
8     public class DataAnnotationsModelMetadata : ModelMetadata {
9         private DisplayColumnAttribute _displayColumnAttribute;
10
11         public DataAnnotationsModelMetadata(DataAnnotationsModelMetadataProvider provider, Type containerType,
12                                             Func<object> modelAccessor, Type modelType, string propertyName,
13                                             DisplayColumnAttribute displayColumnAttribute)
14             : base(provider, containerType, modelAccessor, modelType, propertyName) {
15             _displayColumnAttribute = displayColumnAttribute;
16         }
17
18         protected override string GetSimpleDisplayText() {
19             if (Model != null) {
20                 if (_displayColumnAttribute != null && !String.IsNullOrEmpty(_displayColumnAttribute.DisplayColumn)) {
21                     PropertyInfo displayColumnProperty = ModelType.GetProperty(_displayColumnAttribute.DisplayColumn, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);
22                     ValidateDisplayColumnAttribute(_displayColumnAttribute, displayColumnProperty, ModelType);
23
24                     object simpleDisplayTextValue = displayColumnProperty.GetValue(Model, new object[0]);
25                     if (simpleDisplayTextValue != null) {
26                         return simpleDisplayTextValue.ToString();
27                     }
28                 }
29             }
30
31             return base.GetSimpleDisplayText();
32         }
33
34         private static void ValidateDisplayColumnAttribute(DisplayColumnAttribute displayColumnAttribute, PropertyInfo displayColumnProperty, Type modelType) {
35             if (displayColumnProperty == null) {
36                 throw new InvalidOperationException(
37                     String.Format(
38                         CultureInfo.CurrentCulture,
39                         MvcResources.DataAnnotationsModelMetadataProvider_UnknownProperty,
40                         modelType.FullName, displayColumnAttribute.DisplayColumn));
41             }
42             if (displayColumnProperty.GetGetMethod() == null) {
43                 throw new InvalidOperationException(
44                     String.Format(
45                         CultureInfo.CurrentCulture,
46                         MvcResources.DataAnnotationsModelMetadataProvider_UnreadableProperty,
47                         modelType.FullName, displayColumnAttribute.DisplayColumn));
48             }
49         }
50     }
51 }