From 4f3e0449287eb36c8b7385e42e9b2de15a2f0441 Mon Sep 17 00:00:00 2001 From: Charlie Daly Date: Tue, 19 Dec 2017 23:16:28 +0000 Subject: [PATCH] HtmlHelper.DisplayTextFor should use DisplayAttribute of enums - #7033 --- .../ViewFeatures/ModelExplorerExtensions.cs | 17 ++++++++ .../Rendering/HtmlHelperDisplayTextTest.cs | 40 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/ModelExplorerExtensions.cs b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/ModelExplorerExtensions.cs index 6441a9f3e7..c1eaa04c99 100644 --- a/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/ModelExplorerExtensions.cs +++ b/src/Microsoft.AspNetCore.Mvc.ViewFeatures/ViewFeatures/ModelExplorerExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics; using System.Globalization; using System.Linq; @@ -40,6 +41,22 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures return modelExplorer.Metadata.NullDisplayText; } + if (modelExplorer.Metadata.IsEnum && modelExplorer.Model is Enum modelEnum) + { + var enumStringValue = modelEnum.ToString("d"); + var enumGroupedDisplayNamesAndValues = modelExplorer.Metadata.EnumGroupedDisplayNamesAndValues; + + Debug.Assert(enumGroupedDisplayNamesAndValues != null); + + foreach (var kvp in enumGroupedDisplayNamesAndValues) + { + if (string.Equals(kvp.Value, enumStringValue, StringComparison.Ordinal)) + { + return kvp.Key.Name; + } + } + } + var stringResult = Convert.ToString(modelExplorer.Model, CultureInfo.CurrentCulture); if (stringResult == null) { diff --git a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Rendering/HtmlHelperDisplayTextTest.cs b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Rendering/HtmlHelperDisplayTextTest.cs index d0bbe3118f..822e66caf2 100644 --- a/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Rendering/HtmlHelperDisplayTextTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/Rendering/HtmlHelperDisplayTextTest.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc.ModelBinding; using Xunit; @@ -296,6 +297,34 @@ namespace Microsoft.AspNetCore.Mvc.Rendering Assert.Equal("Property value", result); } + [Fact] + public void DisplayTextFor_EnumDisplayAttribute_WhenPresent() + { + // Arrange + var model = EnumWithDisplayAttribute.Value1; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + + // Act + var result = helper.DisplayTextFor(m => m); + + // Assert + Assert.Equal("Value One", result); + } + + [Fact] + public void DisplayTextFor_EnumDisplayAttribute_WhenNotPresent() + { + // Arrange + var model = EnumWithoutDisplayAttribute.Value1; + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model); + + // Act + var result = helper.DisplayTextFor(m => m); + + // Assert + Assert.Equal("Value1", result); + } + // ModelMetadata.SimpleDisplayText returns ToString() result if that method has been overridden. private sealed class OverriddenToStringModel { @@ -315,5 +344,16 @@ namespace Microsoft.AspNetCore.Mvc.Rendering return _simpleDisplayText; } } + + public enum EnumWithDisplayAttribute + { + [Display(Name = "Value One")] + Value1 + } + + public enum EnumWithoutDisplayAttribute + { + Value1 + } } }