diff options
Diffstat (limited to 'src/System.Web.Mvc/DataAnnotationsModelMetadata.cs')
-rw-r--r-- | src/System.Web.Mvc/DataAnnotationsModelMetadata.cs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/System.Web.Mvc/DataAnnotationsModelMetadata.cs b/src/System.Web.Mvc/DataAnnotationsModelMetadata.cs new file mode 100644 index 00000000..9b8156e3 --- /dev/null +++ b/src/System.Web.Mvc/DataAnnotationsModelMetadata.cs @@ -0,0 +1,60 @@ +using System.ComponentModel.DataAnnotations; +using System.Globalization; +using System.Reflection; +using System.Web.Mvc.Properties; + +namespace System.Web.Mvc +{ + public class DataAnnotationsModelMetadata : ModelMetadata + { + private DisplayColumnAttribute _displayColumnAttribute; + + public DataAnnotationsModelMetadata(DataAnnotationsModelMetadataProvider provider, Type containerType, + Func<object> modelAccessor, Type modelType, string propertyName, + DisplayColumnAttribute displayColumnAttribute) + : base(provider, containerType, modelAccessor, modelType, propertyName) + { + _displayColumnAttribute = displayColumnAttribute; + } + + protected override string GetSimpleDisplayText() + { + if (Model != null) + { + if (_displayColumnAttribute != null && !String.IsNullOrEmpty(_displayColumnAttribute.DisplayColumn)) + { + PropertyInfo displayColumnProperty = ModelType.GetProperty(_displayColumnAttribute.DisplayColumn, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance); + ValidateDisplayColumnAttribute(_displayColumnAttribute, displayColumnProperty, ModelType); + + object simpleDisplayTextValue = displayColumnProperty.GetValue(Model, new object[0]); + if (simpleDisplayTextValue != null) + { + return simpleDisplayTextValue.ToString(); + } + } + } + + return base.GetSimpleDisplayText(); + } + + private static void ValidateDisplayColumnAttribute(DisplayColumnAttribute displayColumnAttribute, PropertyInfo displayColumnProperty, Type modelType) + { + if (displayColumnProperty == null) + { + throw new InvalidOperationException( + String.Format( + CultureInfo.CurrentCulture, + MvcResources.DataAnnotationsModelMetadataProvider_UnknownProperty, + modelType.FullName, displayColumnAttribute.DisplayColumn)); + } + if (displayColumnProperty.GetGetMethod() == null) + { + throw new InvalidOperationException( + String.Format( + CultureInfo.CurrentCulture, + MvcResources.DataAnnotationsModelMetadataProvider_UnreadableProperty, + modelType.FullName, displayColumnAttribute.DisplayColumn)); + } + } + } +} |