Поддержка optgroup в выпадающем списке .NET MVC?

Продолжая этот вопрос с программным созданием выпадающего списка, я бы хотел, чтобы в моем списке было несколько списков optgroup . Возможно ли это в настоящее время?

Я знаю, что мне нужно передать selectList в dropDownList, но не знаю, как добавить текст, значение, optgroup в selectList.

Я хочу получить конечный результат:

 Please select  1 2 3 4   A B C   

Просматривая код на http://www.codeplex.com/aspnet , не кажется, что ни метод SelectList, ни метод расширения DropDownList не поддерживают использование OptGroup в select. Похоже, вам нужно написать свой собственный метод расширения и расширить SelectListItem, чтобы содержать группировку или генерировать выбор вручную в разметке.

Мое расширение немного сложнее, но у него все перегрузки, как у оригинального DropDownList.

На самом деле я создал его специально, чтобы иметь возможность создавать DropDownList с группами и преобразовываться в два смежных выбора с помощью jDoubleSelect

 using System;using System.Collections;using System.Collections.Generic;using System.Globalization; using System.Linq;using System.Linq.Expressions;using System.Text; using System.Web;using System.Web.Mvc;using System.Web.Routing; public class GroupedSelectListItem : SelectListItem { public string GroupKey { get; set; } public string GroupName { get; set; } } public static class HtmlHelpers { public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name) { return DropDownListHelper(htmlHelper, name, null, null, null); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, IEnumerable selectList) { return DropDownListHelper(htmlHelper, name, selectList, null, null); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, string optionLabel) { return DropDownListHelper(htmlHelper, name, null, optionLabel, null); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, IEnumerable selectList, IDictionary htmlAttributes) { return DropDownListHelper(htmlHelper, name, selectList, null, htmlAttributes); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, IEnumerable selectList, object htmlAttributes) { return DropDownListHelper(htmlHelper, name, selectList, null, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, IEnumerable selectList, string optionLabel) { return DropDownListHelper(htmlHelper, name, selectList, optionLabel, null); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, IEnumerable selectList, string optionLabel, IDictionary htmlAttributes) { return DropDownListHelper(htmlHelper, name, selectList, optionLabel, htmlAttributes); } public static MvcHtmlString DropDownGroupList(this HtmlHelper htmlHelper, string name, IEnumerable selectList, string optionLabel, object htmlAttributes) { return DropDownListHelper(htmlHelper, name, selectList, optionLabel, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList) { return DropDownGroupListFor(htmlHelper, expression, selectList, null /* optionLabel */, null /* htmlAttributes */); } public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, object htmlAttributes) { return DropDownGroupListFor(htmlHelper, expression, selectList, null /* optionLabel */, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, IDictionary htmlAttributes) { return DropDownGroupListFor(htmlHelper, expression, selectList, null /* optionLabel */, htmlAttributes); } public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, string optionLabel) { return DropDownGroupListFor(htmlHelper, expression, selectList, optionLabel, null /* htmlAttributes */); } public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, string optionLabel, object htmlAttributes) { return DropDownGroupListFor(htmlHelper, expression, selectList, optionLabel, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); } public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, string optionLabel, IDictionary htmlAttributes) { if (expression == null) { throw new ArgumentNullException("expression"); } return DropDownListHelper(htmlHelper, ExpressionHelper.GetExpressionText(expression), selectList, optionLabel, htmlAttributes); } private static MvcHtmlString DropDownListHelper(HtmlHelper htmlHelper, string expression, IEnumerable selectList, string optionLabel, IDictionary htmlAttributes) { return SelectInternal(htmlHelper, optionLabel, expression, selectList, false /* allowMultiple */, htmlAttributes); } // Helper methods private static IEnumerable GetSelectData(this HtmlHelper htmlHelper, string name) { object o = null; if (htmlHelper.ViewData != null) { o = htmlHelper.ViewData.Eval(name); } if (o == null) { throw new InvalidOperationException( String.Format( CultureInfo.CurrentCulture, "Missing Select Data")); } var selectList = o as IEnumerable; if (selectList == null) { throw new InvalidOperationException( String.Format( CultureInfo.CurrentCulture, "Wrong Select DataType")); } return selectList; } internal static string ListItemToOption(GroupedSelectListItem item) { var builder = new TagBuilder("option") { InnerHtml = HttpUtility.HtmlEncode(item.Text) }; if (item.Value != null) { builder.Attributes["value"] = item.Value; } if (item.Selected) { builder.Attributes["selected"] = "selected"; } return builder.ToString(TagRenderMode.Normal); } private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable selectList, bool allowMultiple, IDictionary htmlAttributes) { name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); if (String.IsNullOrEmpty(name)) { throw new ArgumentException("Null Or Empty", "name"); } bool usedViewData = false; // If we got a null selectList, try to use ViewData to get the list of items. if (selectList == null) { selectList = htmlHelper.GetSelectData(name); usedViewData = true; } object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(name, typeof(string[])) : htmlHelper.GetModelStateValue(name, typeof(string)); // If we haven't already used ViewData to get the entire list of items then we need to // use the ViewData-supplied value before using the parameter-supplied value. if (!usedViewData) { if (defaultValue == null) { defaultValue = htmlHelper.ViewData.Eval(name); } } if (defaultValue != null) { var defaultValues = (allowMultiple) ? defaultValue as IEnumerable : new[] { defaultValue }; var values = from object value in defaultValues select Convert.ToString(value, CultureInfo.CurrentCulture); var selectedValues = new HashSet(values, StringComparer.OrdinalIgnoreCase); var newSelectList = new List(); foreach (var item in selectList) { item.Selected = (item.Value != null) ? selectedValues.Contains(item.Value) : selectedValues.Contains(item.Text); newSelectList.Add(item); } selectList = newSelectList; } // Convert each ListItem to an ", groupName, group.Key)); foreach (GroupedSelectListItem item in group) { listItemBuilder.AppendLine(ListItemToOption(item)); } listItemBuilder.AppendLine(""); } var tagBuilder = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() }; tagBuilder.MergeAttributes(htmlAttributes); tagBuilder.MergeAttribute("name", name, true /* replaceExisting */); tagBuilder.GenerateId(name); if (allowMultiple) { tagBuilder.MergeAttribute("multiple", "multiple"); } // If there are any errors for a named field, we add the css attribute. ModelState modelState; if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) { if (modelState.Errors.Count > 0) { tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); } } return MvcHtmlString.Create(tagBuilder.ToString()); } internal static object GetModelStateValue(this HtmlHelper helper, string key, Type destinationType) { ModelState modelState; if (helper.ViewData.ModelState.TryGetValue(key, out modelState)) { if (modelState.Value != null) { return modelState.Value.ConvertTo(destinationType, null /* culture */); } } return null; } } 

Это было добавлено в ASP.Net MVC в версии 5.2 и теперь встроено.

Свойство Group в SelectListItem позволяет указать группу для каждого элемента:

Новые конструкторы SelectList также позволяют указать имя поля, содержащего заголовок группы, в поставляемом списке элементов.

Методы HtmlHelper DropDownList и DropDownListFor теперь генерируют элементы optgroup на основе групп, включенных в список элементов.

Легко!

Я просто пишу расширения для этого, см. Его:


 using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Routing; namespace System.Web.Mvc.Html { public static class GroupDropListExtensions { public static string GroupDropList(this HtmlHelper helper, string name, IEnumerable data, string SelectedValue, object htmlAttributes) { if (data == null && helper.ViewData != null) data = helper.ViewData.Eval(name) as IEnumerable; if (data == null) return string.Empty; var select = new TagBuilder("select"); if (htmlAttributes != null) select.MergeAttributes(new RouteValueDictionary(htmlAttributes)); select.GenerateId(name); var optgroupHtml = new StringBuilder(); var groups = data.ToList(); foreach (var group in data) { var groupTag = new TagBuilder("optgroup"); groupTag.Attributes.Add("label", helper.Encode( group.Name)); var optHtml = new StringBuilder(); foreach (var item in group.Items) { var option = new TagBuilder("option"); option.Attributes.Add("value", helper.Encode(item.Value)); if (SelectedValue != null && item.Value == SelectedValue) option.Attributes.Add("selected", "selected"); option.InnerHtml = helper.Encode(item.Text); optHtml.AppendLine(option.ToString(TagRenderMode.Normal)); } groupTag.InnerHtml = optHtml.ToString(); optgroupHtml.AppendLine(groupTag.ToString(TagRenderMode.Normal)); } select.InnerHtml = optgroupHtml.ToString(); return select.ToString(TagRenderMode.Normal); } } public class GroupDropListItem { public string Name { get; set; } public List Items { get; set; } } public class OptionItem { public string Text { get; set; } public string Value { get; set; } } } 

Аннотации данных для проверки клиентов отсутствуют?

В ответ на вопрос Chrno Love выше, добавив решение Сержа Заба – исправление Milimetric для атрибутов проверки клиентов MVC3 при использовании коллекции выпадающих списков в одном представлении:

  public static MvcHtmlString DropDownGroupListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable selectList, string optionLabel, IDictionary htmlAttributes) { if (expression == null) { throw new ArgumentNullException("expression"); } // fixing clientside validation attributes // http://stackoverflow.com/questions/4799958/asp-net-mvc-3-unobtrusive-client-validation-does-not-work-with-drop-down-lists/8102022#8102022 var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var mergedAttributes = htmlHelper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata); if (htmlAttributes != null) { foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(htmlAttributes)) { object value = descriptor.GetValue(htmlAttributes); mergedAttributes.Add(descriptor.Name, value); } } //return DropDownListHelper(htmlHelper, ExpressionHelper.GetExpressionText(expression), selectList, optionLabel, htmlAttributes); return DropDownListHelper(htmlHelper, ExpressionHelper.GetExpressionText(expression), selectList, optionLabel, mergedAttributes); } 

Ответ Сержа Заба был именно тем, что я искал. Будучи жестким программистом VB, я поместил его в этот модуль VB:

 'based on Serge Zab's answer on http://stackoverflow.com/questions/607188/support-for-optgroup-in-dropdownlist-net-mvc Imports System.Collections Imports System.Collections.Generic Imports System.Globalization Imports System.Linq Imports System.Linq.Expressions Imports System.Text Imports System.Web Imports System.Web.Mvc Imports System.Web.Routing Public Class GroupedSelectListItem Inherits SelectListItem Public Property GroupKey() As String Get Return m_GroupKey End Get Set(value As String) m_GroupKey = Value End Set End Property Private m_GroupKey As String Public Property GroupName() As String Get Return m_GroupName End Get Set(value As String) m_GroupName = Value End Set End Property Private m_GroupName As String End Class Public Module HtmlHelpers  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, Nothing, Nothing, Nothing) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, selectList As IEnumerable(Of GroupedSelectListItem)) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, selectList, Nothing, Nothing) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, optionLabel As String) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, Nothing, optionLabel, Nothing) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, selectList As IEnumerable(Of GroupedSelectListItem), htmlAttributes As IDictionary(Of String, Object)) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, selectList, Nothing, htmlAttributes) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, selectList As IEnumerable(Of GroupedSelectListItem), htmlAttributes As Object) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, selectList, Nothing, New RouteValueDictionary(htmlAttributes)) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, selectList, optionLabel, Nothing) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String, htmlAttributes As IDictionary(Of String, Object)) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, selectList, optionLabel, htmlAttributes) End Function  _ Public Function DropDownGroupList(htmlHelper As HtmlHelper, name As String, selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String, htmlAttributes As Object) As MvcHtmlString Return DropDownListHelper(htmlHelper, name, selectList, optionLabel, New RouteValueDictionary(htmlAttributes)) End Function  _ Public Function DropDownGroupListFor(Of TModel, TProperty)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), selectList As IEnumerable(Of GroupedSelectListItem)) As MvcHtmlString ' optionLabel ' htmlAttributes Return DropDownGroupListFor(htmlHelper, expression, selectList, Nothing, Nothing) End Function  _ Public Function DropDownGroupListFor(Of TModel, TProperty)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), selectList As IEnumerable(Of GroupedSelectListItem), htmlAttributes As Object) As MvcHtmlString ' optionLabel Return DropDownGroupListFor(htmlHelper, expression, selectList, Nothing, New RouteValueDictionary(htmlAttributes)) End Function  _ Public Function DropDownGroupListFor(Of TModel, TProperty)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), selectList As IEnumerable(Of GroupedSelectListItem), htmlAttributes As IDictionary(Of String, Object)) As MvcHtmlString ' optionLabel Return DropDownGroupListFor(htmlHelper, expression, selectList, Nothing, htmlAttributes) End Function  _ Public Function DropDownGroupListFor(Of TModel, TProperty)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String) As MvcHtmlString ' htmlAttributes Return DropDownGroupListFor(htmlHelper, expression, selectList, optionLabel, Nothing) End Function  _ Public Function DropDownGroupListFor(Of TModel, TProperty)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String, htmlAttributes As Object) As MvcHtmlString Return DropDownGroupListFor(htmlHelper, expression, selectList, optionLabel, New RouteValueDictionary(htmlAttributes)) End Function  _ Public Function DropDownGroupListFor(Of TModel, TProperty)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String, htmlAttributes As IDictionary(Of String, Object)) As MvcHtmlString If expression Is Nothing Then Throw New ArgumentNullException("expression") End If Return DropDownListHelper(htmlHelper, ExpressionHelper.GetExpressionText(expression), selectList, optionLabel, htmlAttributes) End Function Private Function DropDownListHelper(htmlHelper As HtmlHelper, expression As String, selectList As IEnumerable(Of GroupedSelectListItem), optionLabel As String, htmlAttributes As IDictionary(Of String, Object)) As MvcHtmlString ' allowMultiple Return SelectInternal(htmlHelper, optionLabel, expression, selectList, False, htmlAttributes) End Function ' Helper methods  _ Private Function GetSelectData(htmlHelper As HtmlHelper, name As String) As IEnumerable(Of GroupedSelectListItem) Dim o As Object = Nothing If htmlHelper.ViewData IsNot Nothing Then o = htmlHelper.ViewData.Eval(name) End If If o Is Nothing Then Throw New InvalidOperationException([String].Format(CultureInfo.CurrentCulture, "Missing Select Data", name, "IEnumerable")) End If Dim selectList As IEnumerable(Of GroupedSelectListItem) = TryCast(o, IEnumerable(Of GroupedSelectListItem)) If selectList Is Nothing Then Throw New InvalidOperationException([String].Format(CultureInfo.CurrentCulture, "Wrong Select DataType", name, o.[GetType]().FullName, "IEnumerable")) End If Return selectList End Function Friend Function ListItemToOption(item As GroupedSelectListItem) As String Dim builder As New TagBuilder("option") With { _ .InnerHtml = HttpUtility.HtmlEncode(item.Text) _ } If item.Value IsNot Nothing Then builder.Attributes("value") = item.Value End If If item.Selected Then builder.Attributes("selected") = "selected" End If Return builder.ToString(TagRenderMode.Normal) End Function  _ Private Function SelectInternal(htmlHelper__1 As HtmlHelper, optionLabel As String, name As String, selectList As IEnumerable(Of GroupedSelectListItem), allowMultiple As Boolean, htmlAttributes As IDictionary(Of String, Object)) As MvcHtmlString name = htmlHelper__1.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name) If [String].IsNullOrEmpty(name) Then Throw New ArgumentException("Null Or Empty", "name") End If Dim usedViewData As Boolean = False ' If we got a null selectList, try to use ViewData to get the list of items. If selectList Is Nothing Then selectList = htmlHelper__1.GetSelectData(name) usedViewData = True End If Dim defaultValue As Object = If((allowMultiple), htmlHelper__1.GetModelStateValue(name, GetType(String())), htmlHelper__1.GetModelStateValue(name, GetType(String))) ' If we haven't already used ViewData to get the entire list of items then we need to ' use the ViewData-supplied value before using the parameter-supplied value. If Not usedViewData Then If defaultValue Is Nothing Then defaultValue = htmlHelper__1.ViewData.Eval(name) End If End If If defaultValue IsNot Nothing Then Dim defaultValues As IEnumerable = If((allowMultiple), TryCast(defaultValue, IEnumerable), New String() {defaultValue}) Dim values As IEnumerable(Of String) = From value In defaultValues Select (Convert.ToString(value, CultureInfo.CurrentCulture)) Dim selectedValues As New HashSet(Of String)(values, StringComparer.OrdinalIgnoreCase) Dim newSelectList As New List(Of GroupedSelectListItem)() For Each item As GroupedSelectListItem In selectList item.Selected = If((item.Value IsNot Nothing), selectedValues.Contains(item.Value), selectedValues.Contains(item.Text)) newSelectList.Add(item) Next selectList = newSelectList End If ' Convert each ListItem to an ", groupName, group.Key)) For Each item As GroupedSelectListItem In group listItemBuilder.AppendLine(ListItemToOption(item)) Next listItemBuilder.AppendLine("") Next Dim tagBuilder As New TagBuilder("select") With { _ .InnerHtml = listItemBuilder.ToString() _ } TagBuilder.MergeAttributes(htmlAttributes) ' replaceExisting TagBuilder.MergeAttribute("name", name, True) TagBuilder.GenerateId(name) If allowMultiple Then TagBuilder.MergeAttribute("multiple", "multiple") End If ' If there are any errors for a named field, we add the css attribute. Dim modelState As ModelState = Nothing If htmlHelper__1.ViewData.ModelState.TryGetValue(name, modelState) Then If modelState.Errors.Count > 0 Then TagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName) End If End If Return MvcHtmlString.Create(TagBuilder.ToString()) End Function  _ Friend Function GetModelStateValue(helper As HtmlHelper, key As String, destinationType As Type) As Object Dim modelState As ModelState = Nothing If helper.ViewData.ModelState.TryGetValue(key, modelState) Then If modelState.Value IsNot Nothing Then ' culture Return modelState.Value.ConvertTo(destinationType, Nothing) End If End If Return Nothing End Function End Module 

Я пытаюсь решить решение @Serge Zab, которое работает хорошо, но с некоторыми проблемами с ненавязчивой проверкой, после некоторой проверки я нашел проблему.

Кажется, есть некоторые обязательные атрибуты, отсутствующие в элементе select, если вы хотите, чтобы проверка Jquery срабатывала, сразу после создания TagBuilder

 TagBuilder tagBuilder = new TagBuilder("select"); 

Добавьте эти атрибуты

 tagBuilder.MergeAttribute("data-val", "true",true); tagBuilder.MergeAttribute("data-val-required", "your validation message", true) 

и ненавязчивая проверка должна срабатывать.

В ответе Сержа Заба атрибуты данных, такие как data_valuename , не помещают в правильную форму data-valuename .

Я заменил код tagBuilder.MergeAttributes(htmlAttributes); в методе SelectInternal для этого

 foreach (var htmlAttribute in htmlAttributes) { tagBuilder.MergeAttribute( htmlAttribute.Key.Replace('_', '-'), (string)htmlAttribute.Value ); } 

Просто обратите внимание на использование расширения Сержа для создания более одного списка выбора в той же форме. У меня возникли проблемы с получением второго списка выбора для применения групп, и когда я исследовал генерируемый html, я понял, что оба имеют одинаковый идентификатор. Чтобы исправить это, перейдите в функцию SelectInternal в расширении serge и закомментируйте / удалите следующие две строки:

tagBuilder.MergeAttribute (“name”, name, true / * replaceExisting * /); tagBuilder.GenerateId (имя);

В качестве альтернативы вы можете просто передавать уникальный идентификатор каждому (хотя DropDownGroupListFor не принимает параметр «имя строки», поэтому вам нужно будет добавить перегрузку)

Мне нужно решение для обработки множественного выбора с optgroup, и я использовал решение Serge Zab. У меня всего два комментария об этом (слишком долго для комментария).

  • Несмотря на его претензии, его решение не поддерживает все существующие перегрузки DropDownListFor, поскольку он не поддерживает MultiSelectList или SelectList, который часто используется в моделях. Но это не сложно добавить.

  • Его решение не работало для меня для множественного выбора, чтобы инициализировать выбранные / не выбранные элементы из модели: исходные значения не были затронуты. Я только что изменил следующий метод:

    private static MvcHtmlString DropDownListHelper (…) {return SelectInternal (htmlHelper, optionLabel, expression, selectList, false / * allowMultiple * /, htmlAttributes); }

К этому :

 private static MvcHtmlString DropDownListHelper(HtmlHelper htmlHelper, string expression, IEnumerable selectList, string optionLabel, IDictionary htmlAttributes) { bool allowMultiple = htmlAttributes.ContainsKey("multiple"); return SelectInternal(htmlHelper, optionLabel, expression, selectList, allowMultiple, htmlAttributes); } 

И это сработало, как ожидалось. Конечно, должен быть определен множественный атрибут: @ Html.DropDownGroupListFor (m => m.Selected, Model.Values, new {multiple = “multiple”})

Спасибо Сергею за его ответ.

  • Выпадающий список ASP.NET MVC из SelectList
  • Asp.net - Добавить пустой элемент в верхней части раскрывающегося списка
  • Селен WebDriver и DropDown Boxes
  • Как установить значение DropDownList с помощью jQuery?
  • Угловые 2+ и наблюдаемые: не могут привязываться к 'ngModel', поскольку это не известное свойство 'select'
  • Редактирование строки Gridview - динамическое связывание с DropDownList
  • сделать выпадающий список элементов невыбранным
  • Элемент управления Dropdownlist с помощью s для asp.net (webforms)?
  • Html.EnumDropdownListFor: отображение текста по умолчанию
  • Заполнение выпадающего списка HTML в JSP со значениями, полученными из базы данных в Servlet
  • Как выбрать / получить раскрывающийся список в Selenium 2
  • Interesting Posts

    5 лет спустя, есть ли что-то лучшее, чем «самые быстрые возможные delegates на С ++»?

    Будут ли работать настольные и жесткие диски в течение 7 лет?

    PGP (GnuPG) – каково было исходное имя файла?

    Выключить пользователя из заблокированной заставки?

    MSBuild Script и VS2010 публикуют применение преобразования Web.config

    Как включить другой XHTML в XHTML с помощью JSF 2.0 Facelets?

    Использование Swift CFunctionPointer для передачи обратного вызова API CoreMIDI

    Прокрутка двумя пальцами с помощью UIScrollView

    Найти все элементы на странице, чей идентификатор элемента содержит определенный текст, используя jQuery

    Понижающий Linux

    Отладчик JavaScript

    Что такое имена столбцов DataTable с точками, что делает их непригодными для управления DataGrid WPF?

    Как извлечь числа из строки и получить массив ints?

    Изменение цвета фона выбранного элемента в ListView

    как проверить элемент в selenium3.6, поскольку firebug больше не является вариантом для FF 56?

    Давайте будем гением компьютера.