diff options
Diffstat (limited to 'src/System.Web.Mvc/DataAnnotationsModelMetadataProvider.cs')
-rw-r--r-- | src/System.Web.Mvc/DataAnnotationsModelMetadataProvider.cs | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/System.Web.Mvc/DataAnnotationsModelMetadataProvider.cs b/src/System.Web.Mvc/DataAnnotationsModelMetadataProvider.cs new file mode 100644 index 00000000..7ffef9c7 --- /dev/null +++ b/src/System.Web.Mvc/DataAnnotationsModelMetadataProvider.cs @@ -0,0 +1,115 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; + +namespace System.Web.Mvc +{ + public class DataAnnotationsModelMetadataProvider : AssociatedMetadataProvider + { + protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) + { + List<Attribute> attributeList = new List<Attribute>(attributes); + DisplayColumnAttribute displayColumnAttribute = attributeList.OfType<DisplayColumnAttribute>().FirstOrDefault(); + DataAnnotationsModelMetadata result = new DataAnnotationsModelMetadata(this, containerType, modelAccessor, modelType, propertyName, displayColumnAttribute); + + // Do [HiddenInput] before [UIHint], so you can override the template hint + HiddenInputAttribute hiddenInputAttribute = attributeList.OfType<HiddenInputAttribute>().FirstOrDefault(); + if (hiddenInputAttribute != null) + { + result.TemplateHint = "HiddenInput"; + result.HideSurroundingHtml = !hiddenInputAttribute.DisplayValue; + } + + // We prefer [UIHint("...", PresentationLayer = "MVC")] but will fall back to [UIHint("...")] + IEnumerable<UIHintAttribute> uiHintAttributes = attributeList.OfType<UIHintAttribute>(); + UIHintAttribute uiHintAttribute = uiHintAttributes.FirstOrDefault(a => String.Equals(a.PresentationLayer, "MVC", StringComparison.OrdinalIgnoreCase)) + ?? uiHintAttributes.FirstOrDefault(a => String.IsNullOrEmpty(a.PresentationLayer)); + if (uiHintAttribute != null) + { + result.TemplateHint = uiHintAttribute.UIHint; + } + + DataTypeAttribute dataTypeAttribute = attributeList.OfType<DataTypeAttribute>().FirstOrDefault(); + if (dataTypeAttribute != null) + { + result.DataTypeName = dataTypeAttribute.ToDataTypeName(); + } + + EditableAttribute editable = attributes.OfType<EditableAttribute>().FirstOrDefault(); + if (editable != null) + { + result.IsReadOnly = !editable.AllowEdit; + } + else + { + ReadOnlyAttribute readOnlyAttribute = attributeList.OfType<ReadOnlyAttribute>().FirstOrDefault(); + if (readOnlyAttribute != null) + { + result.IsReadOnly = readOnlyAttribute.IsReadOnly; + } + } + + DisplayFormatAttribute displayFormatAttribute = attributeList.OfType<DisplayFormatAttribute>().FirstOrDefault(); + if (displayFormatAttribute == null && dataTypeAttribute != null) + { + displayFormatAttribute = dataTypeAttribute.DisplayFormat; + } + if (displayFormatAttribute != null) + { + result.NullDisplayText = displayFormatAttribute.NullDisplayText; + result.DisplayFormatString = displayFormatAttribute.DataFormatString; + result.ConvertEmptyStringToNull = displayFormatAttribute.ConvertEmptyStringToNull; + + if (displayFormatAttribute.ApplyFormatInEditMode) + { + result.EditFormatString = displayFormatAttribute.DataFormatString; + } + + if (!displayFormatAttribute.HtmlEncode && String.IsNullOrWhiteSpace(result.DataTypeName)) + { + result.DataTypeName = DataTypeUtil.HtmlTypeName; + } + } + + ScaffoldColumnAttribute scaffoldColumnAttribute = attributeList.OfType<ScaffoldColumnAttribute>().FirstOrDefault(); + if (scaffoldColumnAttribute != null) + { + result.ShowForDisplay = result.ShowForEdit = scaffoldColumnAttribute.Scaffold; + } + + DisplayAttribute display = attributes.OfType<DisplayAttribute>().FirstOrDefault(); + string name = null; + if (display != null) + { + result.Description = display.GetDescription(); + result.ShortDisplayName = display.GetShortName(); + result.Watermark = display.GetPrompt(); + result.Order = display.GetOrder() ?? ModelMetadata.DefaultOrder; + + name = display.GetName(); + } + + if (name != null) + { + result.DisplayName = name; + } + else + { + DisplayNameAttribute displayNameAttribute = attributeList.OfType<DisplayNameAttribute>().FirstOrDefault(); + if (displayNameAttribute != null) + { + result.DisplayName = displayNameAttribute.DisplayName; + } + } + + RequiredAttribute requiredAttribute = attributeList.OfType<RequiredAttribute>().FirstOrDefault(); + if (requiredAttribute != null) + { + result.IsRequired = true; + } + + return result; + } + } +} |