Extend `IHtmlGenerator.GenerateSelect()` to make selected values available

nit: use Linq methods, not query syntax in `DefaultHtmlGenerator`
This commit is contained in:
Doug Bunting 2014-11-04 15:41:10 -08:00
parent de9a999bf6
commit 3d84b528e5
2 changed files with 45 additions and 8 deletions

View File

@ -357,7 +357,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
} }
/// <inheritdoc /> /// <inheritdoc />
public virtual TagBuilder GenerateSelect( public TagBuilder GenerateSelect(
[NotNull] ViewContext viewContext, [NotNull] ViewContext viewContext,
ModelMetadata metadata, ModelMetadata metadata,
string optionLabel, string optionLabel,
@ -365,6 +365,29 @@ namespace Microsoft.AspNet.Mvc.Rendering
IEnumerable<SelectListItem> selectList, IEnumerable<SelectListItem> selectList,
bool allowMultiple, bool allowMultiple,
object htmlAttributes) object htmlAttributes)
{
ICollection<string> ignored;
return GenerateSelect(
viewContext,
metadata,
optionLabel,
name,
selectList,
allowMultiple,
htmlAttributes,
selectedValues: out ignored);
}
/// <inheritdoc />
public virtual TagBuilder GenerateSelect(
[NotNull] ViewContext viewContext,
ModelMetadata metadata,
string optionLabel,
string name,
IEnumerable<SelectListItem> selectList,
bool allowMultiple,
object htmlAttributes,
out ICollection<string> selectedValues)
{ {
var fullName = GetFullHtmlFieldName(viewContext, name); var fullName = GetFullHtmlFieldName(viewContext, name);
if (string.IsNullOrEmpty(fullName)) if (string.IsNullOrEmpty(fullName))
@ -407,7 +430,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
if (defaultValue != null) 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 <option> tag and wrap them with <optgroup> if requested. // Convert each ListItem to an <option> tag and wrap them with <optgroup> if requested.
@ -963,7 +990,8 @@ namespace Microsoft.AspNet.Mvc.Rendering
private static IEnumerable<SelectListItem> UpdateSelectListItemsWithDefaultValue( private static IEnumerable<SelectListItem> UpdateSelectListItemsWithDefaultValue(
IEnumerable<SelectListItem> selectList, IEnumerable<SelectListItem> selectList,
object defaultValue, object defaultValue,
bool allowMultiple) bool allowMultiple,
out ICollection<string> selectedValues)
{ {
IEnumerable defaultValues; IEnumerable defaultValues;
if (allowMultiple) if (allowMultiple)
@ -980,15 +1008,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
defaultValues = new[] { defaultValue }; defaultValues = new[] { defaultValue };
} }
var values = from object value in defaultValues var values =
select Convert.ToString(value, CultureInfo.CurrentCulture); defaultValues.OfType<object>().Select(value => Convert.ToString(value, CultureInfo.CurrentCulture));
// ToString() by default returns an enum value's name. But selectList may use numeric values. // ToString() by default returns an enum value's name. But selectList may use numeric values.
var enumValues = from Enum value in defaultValues.OfType<Enum>() var enumValues = defaultValues.OfType<Enum>().Select(value => value.ToString());
select value.ToString("d");
values = values.Concat(enumValues); values = values.Concat(enumValues);
var selectedValues = new HashSet<string>(values, StringComparer.OrdinalIgnoreCase); selectedValues = new HashSet<string>(values, StringComparer.OrdinalIgnoreCase);
var newSelectList = new List<SelectListItem>(); var newSelectList = new List<SelectListItem>();
foreach (SelectListItem item in selectList) foreach (SelectListItem item in selectList)
{ {

View File

@ -125,6 +125,16 @@ namespace Microsoft.AspNet.Mvc.Rendering
bool allowMultiple, bool allowMultiple,
object htmlAttributes); object htmlAttributes);
TagBuilder GenerateSelect(
[NotNull] ViewContext viewContext,
ModelMetadata metadata,
string optionLabel,
string name,
IEnumerable<SelectListItem> selectList,
bool allowMultiple,
object htmlAttributes,
out ICollection<string> selectedValues);
TagBuilder GenerateTextArea( TagBuilder GenerateTextArea(
[NotNull] ViewContext viewContext, [NotNull] ViewContext viewContext,
ModelMetadata metadata, ModelMetadata metadata,