From 3d84b528e58c007348f59cf483813b0ff635a1bb Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 4 Nov 2014 15:41:10 -0800 Subject: [PATCH] Extend `IHtmlGenerator.GenerateSelect()` to make selected values available nit: use Linq methods, not query syntax in `DefaultHtmlGenerator` --- .../Rendering/Html/DefaultHtmlGenerator.cs | 43 +++++++++++++++---- .../Rendering/Html/IHtmlGenerator.cs | 10 +++++ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs index 0e7e9f3361..794710399c 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs @@ -357,7 +357,7 @@ namespace Microsoft.AspNet.Mvc.Rendering } /// - public virtual TagBuilder GenerateSelect( + public TagBuilder GenerateSelect( [NotNull] ViewContext viewContext, ModelMetadata metadata, string optionLabel, @@ -365,6 +365,29 @@ namespace Microsoft.AspNet.Mvc.Rendering IEnumerable selectList, bool allowMultiple, object htmlAttributes) + { + ICollection ignored; + return GenerateSelect( + viewContext, + metadata, + optionLabel, + name, + selectList, + allowMultiple, + htmlAttributes, + selectedValues: out ignored); + } + + /// + public virtual TagBuilder GenerateSelect( + [NotNull] ViewContext viewContext, + ModelMetadata metadata, + string optionLabel, + string name, + IEnumerable selectList, + bool allowMultiple, + object htmlAttributes, + out ICollection selectedValues) { var fullName = GetFullHtmlFieldName(viewContext, name); if (string.IsNullOrEmpty(fullName)) @@ -407,7 +430,11 @@ namespace Microsoft.AspNet.Mvc.Rendering if (defaultValue != null) { - selectList = UpdateSelectListItemsWithDefaultValue(selectList, defaultValue, allowMultiple); + selectList = UpdateSelectListItemsWithDefaultValue(selectList, defaultValue, allowMultiple, out selectedValues); + } + else + { + selectedValues = new string[0]; } // Convert each ListItem to an if requested. @@ -963,7 +990,8 @@ namespace Microsoft.AspNet.Mvc.Rendering private static IEnumerable UpdateSelectListItemsWithDefaultValue( IEnumerable selectList, object defaultValue, - bool allowMultiple) + bool allowMultiple, + out ICollection selectedValues) { IEnumerable defaultValues; if (allowMultiple) @@ -980,15 +1008,14 @@ namespace Microsoft.AspNet.Mvc.Rendering defaultValues = new[] { defaultValue }; } - var values = from object value in defaultValues - select Convert.ToString(value, CultureInfo.CurrentCulture); + var values = + defaultValues.OfType().Select(value => Convert.ToString(value, CultureInfo.CurrentCulture)); // ToString() by default returns an enum value's name. But selectList may use numeric values. - var enumValues = from Enum value in defaultValues.OfType() - select value.ToString("d"); + var enumValues = defaultValues.OfType().Select(value => value.ToString()); values = values.Concat(enumValues); - var selectedValues = new HashSet(values, StringComparer.OrdinalIgnoreCase); + selectedValues = new HashSet(values, StringComparer.OrdinalIgnoreCase); var newSelectList = new List(); foreach (SelectListItem item in selectList) { diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/IHtmlGenerator.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/IHtmlGenerator.cs index 6d67b9a641..09595bf8f4 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/IHtmlGenerator.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/IHtmlGenerator.cs @@ -125,6 +125,16 @@ namespace Microsoft.AspNet.Mvc.Rendering bool allowMultiple, object htmlAttributes); + TagBuilder GenerateSelect( + [NotNull] ViewContext viewContext, + ModelMetadata metadata, + string optionLabel, + string name, + IEnumerable selectList, + bool allowMultiple, + object htmlAttributes, + out ICollection selectedValues); + TagBuilder GenerateTextArea( [NotNull] ViewContext viewContext, ModelMetadata metadata,