/// <inheritdoc /> public virtual void CreateDisplayMetadata(DisplayMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } foreach (var provider in _providers.OfType<IDisplayMetadataProvider>()) { provider.CreateDisplayMetadata(context); } }
public void CreateDisplayMetadata(DisplayMetadataProviderContext context) { if (context.Key.ContainerType != null && context.Key.MetadataKind == ModelMetadataKind.Property) context.DisplayMetadata.DisplayName = () => ResourceProvider.GetPropertyTitle(context.Key.ContainerType, context.Key.Name); }
/// <inheritdoc /> public void CreateDisplayMetadata(DisplayMetadataProviderContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } var attributes = context.Attributes; var dataTypeAttribute = attributes.OfType<DataTypeAttribute>().FirstOrDefault(); var displayAttribute = attributes.OfType<DisplayAttribute>().FirstOrDefault(); var displayColumnAttribute = attributes.OfType<DisplayColumnAttribute>().FirstOrDefault(); var displayFormatAttribute = attributes.OfType<DisplayFormatAttribute>().FirstOrDefault(); var hiddenInputAttribute = attributes.OfType<HiddenInputAttribute>().FirstOrDefault(); var scaffoldColumnAttribute = attributes.OfType<ScaffoldColumnAttribute>().FirstOrDefault(); var uiHintAttribute = attributes.OfType<UIHintAttribute>().FirstOrDefault(); // Special case the [DisplayFormat] attribute hanging off an applied [DataType] attribute. This property is // non-null for DataType.Currency, DataType.Date, DataType.Time, and potentially custom [DataType] // subclasses. The DataType.Currency, DataType.Date, and DataType.Time [DisplayFormat] attributes have a // non-null DataFormatString and the DataType.Date and DataType.Time [DisplayFormat] attributes have // ApplyFormatInEditMode==true. if (displayFormatAttribute == null && dataTypeAttribute != null) { displayFormatAttribute = dataTypeAttribute.DisplayFormat; } var displayMetadata = context.DisplayMetadata; // ConvertEmptyStringToNull if (displayFormatAttribute != null) { displayMetadata.ConvertEmptyStringToNull = displayFormatAttribute.ConvertEmptyStringToNull; } // DataTypeName if (dataTypeAttribute != null) { displayMetadata.DataTypeName = dataTypeAttribute.GetDataTypeName(); } else if (displayFormatAttribute != null && !displayFormatAttribute.HtmlEncode) { displayMetadata.DataTypeName = DataType.Html.ToString(); } // Description if (displayAttribute != null) { displayMetadata.Description = () => displayAttribute.GetDescription(); displayMetadata.Placeholder = () => displayAttribute.GetPrompt(); } // DisplayFormatString if (displayFormatAttribute != null) { displayMetadata.DisplayFormatString = displayFormatAttribute.DataFormatString; } // DisplayName if (displayAttribute != null) { displayMetadata.DisplayName = () => displayAttribute.GetName(); } // EditFormatString if (displayFormatAttribute != null && displayFormatAttribute.ApplyFormatInEditMode) { displayMetadata.EditFormatString = displayFormatAttribute.DataFormatString; } // IsEnum et cetera var underlyingType = Nullable.GetUnderlyingType(context.Key.ModelType) ?? context.Key.ModelType; var underlyingTypeInfo = underlyingType.GetTypeInfo(); if (underlyingTypeInfo.IsEnum) { // IsEnum displayMetadata.IsEnum = true; // IsFlagsEnum displayMetadata.IsFlagsEnum = underlyingTypeInfo.IsDefined(typeof(FlagsAttribute), inherit: false); // EnumDisplayNamesAndValues and EnumNamesAndValues // // Order EnumDisplayNamesAndValues to match Enum.GetNames(). That method orders by absolute value, // then its behavior is undefined (but hopefully stable). Add to EnumNamesAndValues in same order but // Dictionary does not guarantee order will be preserved. var groupedDisplayNamesAndValues = new List<KeyValuePair<EnumGroupAndName, string>>(); var namesAndValues = new Dictionary<string, string>(); foreach (var name in Enum.GetNames(underlyingType)) { var field = underlyingType.GetField(name); var displayName = GetDisplayName(field); var groupName = GetDisplayGroup(field); var value = ((Enum)field.GetValue(obj: null)).ToString("d"); groupedDisplayNamesAndValues.Add(new KeyValuePair<EnumGroupAndName, string>( new EnumGroupAndName(groupName, displayName), value)); namesAndValues.Add(name, value); } displayMetadata.EnumGroupedDisplayNamesAndValues = groupedDisplayNamesAndValues; displayMetadata.EnumNamesAndValues = namesAndValues; } // HasNonDefaultEditFormat if (!string.IsNullOrEmpty(displayFormatAttribute?.DataFormatString) && displayFormatAttribute?.ApplyFormatInEditMode == true) { // Have a non-empty EditFormatString based on [DisplayFormat] from our cache. if (dataTypeAttribute == null) { // Attributes include no [DataType]; [DisplayFormat] was applied directly. displayMetadata.HasNonDefaultEditFormat = true; } else if (dataTypeAttribute.DisplayFormat != displayFormatAttribute) { // Attributes include separate [DataType] and [DisplayFormat]; [DisplayFormat] provided override. displayMetadata.HasNonDefaultEditFormat = true; } else if (dataTypeAttribute.GetType() != typeof(DataTypeAttribute)) { // Attributes include [DisplayFormat] copied from [DataType] and [DataType] was of a subclass. // Assume the [DataType] constructor used the protected DisplayFormat setter to override its // default. That is derived [DataType] provided override. displayMetadata.HasNonDefaultEditFormat = true; } } // HideSurroundingHtml if (hiddenInputAttribute != null) { displayMetadata.HideSurroundingHtml = !hiddenInputAttribute.DisplayValue; } // HtmlEncode if (displayFormatAttribute != null) { displayMetadata.HtmlEncode = displayFormatAttribute.HtmlEncode; } // NullDisplayText if (displayFormatAttribute != null) { displayMetadata.NullDisplayText = displayFormatAttribute.NullDisplayText; } // Order if (displayAttribute?.GetOrder() != null) { displayMetadata.Order = displayAttribute.GetOrder().Value; } // ShowForDisplay if (scaffoldColumnAttribute != null) { displayMetadata.ShowForDisplay = scaffoldColumnAttribute.Scaffold; } // ShowForEdit if (scaffoldColumnAttribute != null) { displayMetadata.ShowForEdit = scaffoldColumnAttribute.Scaffold; } // SimpleDisplayProperty if (displayColumnAttribute != null) { displayMetadata.SimpleDisplayProperty = displayColumnAttribute.DisplayColumn; } // TemplateHint if (uiHintAttribute != null) { displayMetadata.TemplateHint = uiHintAttribute.UIHint; } else if (hiddenInputAttribute != null) { displayMetadata.TemplateHint = "HiddenInput"; } }