New tests.
[mono.git] / mcs / class / System.Web.Mvc2 / System.Web.Mvc / DataAnnotationsModelMetadata.cs
1 /* ****************************************************************************\r
2  *\r
3  * Copyright (c) Microsoft Corporation. All rights reserved.\r
4  *\r
5  * This software is subject to the Microsoft Public License (Ms-PL). \r
6  * A copy of the license can be found in the license.htm file included \r
7  * in this distribution.\r
8  *\r
9  * You must not remove this notice, or any other, from this software.\r
10  *\r
11  * ***************************************************************************/\r
12 \r
13 namespace System.Web.Mvc {\r
14     using System;\r
15     using System.ComponentModel.DataAnnotations;\r
16     using System.Globalization;\r
17     using System.Reflection;\r
18     using System.Web.Mvc.Resources;\r
19 \r
20     public class DataAnnotationsModelMetadata : ModelMetadata {\r
21         private DisplayColumnAttribute _displayColumnAttribute;\r
22 \r
23         public DataAnnotationsModelMetadata(DataAnnotationsModelMetadataProvider provider, Type containerType,\r
24                                             Func<object> modelAccessor, Type modelType, string propertyName,\r
25                                             DisplayColumnAttribute displayColumnAttribute)\r
26             : base(provider, containerType, modelAccessor, modelType, propertyName) {\r
27             _displayColumnAttribute = displayColumnAttribute;\r
28         }\r
29 \r
30         protected override string GetSimpleDisplayText() {\r
31             if (Model != null) {\r
32                 if (_displayColumnAttribute != null && !String.IsNullOrEmpty(_displayColumnAttribute.DisplayColumn)) {\r
33                     PropertyInfo displayColumnProperty = ModelType.GetProperty(_displayColumnAttribute.DisplayColumn, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);\r
34                     ValidateDisplayColumnAttribute(_displayColumnAttribute, displayColumnProperty, ModelType);\r
35 \r
36                     object simpleDisplayTextValue = displayColumnProperty.GetValue(Model, new object[0]);\r
37                     if (simpleDisplayTextValue != null) {\r
38                         return simpleDisplayTextValue.ToString();\r
39                     }\r
40                 }\r
41             }\r
42 \r
43             return base.GetSimpleDisplayText();\r
44         }\r
45 \r
46         private static void ValidateDisplayColumnAttribute(DisplayColumnAttribute displayColumnAttribute, PropertyInfo displayColumnProperty, Type modelType) {\r
47             if (displayColumnProperty == null) {\r
48                 throw new InvalidOperationException(\r
49                     String.Format(\r
50                         CultureInfo.CurrentCulture,\r
51                         MvcResources.DataAnnotationsModelMetadataProvider_UnknownProperty,\r
52                         modelType.FullName, displayColumnAttribute.DisplayColumn));\r
53             }\r
54             if (displayColumnProperty.GetGetMethod() == null) {\r
55                 throw new InvalidOperationException(\r
56                     String.Format(\r
57                         CultureInfo.CurrentCulture,\r
58                         MvcResources.DataAnnotationsModelMetadataProvider_UnreadableProperty,\r
59                         modelType.FullName, displayColumnAttribute.DisplayColumn));\r
60             }\r
61         }\r
62     }\r
63 }\r