Я пытаюсь использовать Html.DropDownList
метод расширения, но не могу понять, как использовать его с перечислением.
Допустим, у меня есть перечисление как это:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Как мне создать выпадающий список с этими значениями, используя Html.DropDownList
метод расширения?
Или лучше всего просто создать цикл for и создать элементы Html вручную?
c#
asp.net
asp.net-mvc
Kevin Pang
источник
источник
ASP.NET MVC
есть родной способ: stackoverflow.com/a/22295360/1361084Я знаю, что опоздал на вечеринку по этому поводу, но подумал, что этот вариант может оказаться полезным, так как этот также позволяет вам использовать описательные строки, а не константы перечисления в раскрывающемся списке. Для этого украсьте каждую запись перечисления атрибутом [System.ComponentModel.Description].
Например:
Вот мой код:
Затем вы можете сделать это по вашему мнению:
Надеюсь, это поможет вам!
** РЕДАКТИРОВАТЬ 2014-ЯНВ-23: Microsoft только что выпустила MVC 5.1, которая теперь имеет функцию EnumDropDownListFor. К сожалению, он не соответствует атрибуту [Description], поэтому приведенный выше код остается в силе. См. Раздел Enum в примечаниях к выпуску Microsoft для MVC 5.1.
Обновление: хотя он поддерживает атрибут Display
[Display(Name = "Sample")]
, так что его можно использовать.[Обновление - только что заметил, и код выглядит как расширенная версия кода здесь: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , с парой дополнений. Если так, то атрибуция показалась бы честной ;-)]
источник
System.Web.Mvc.Html
нее, она говорит, чтоDropDownListFor
не может быть найдена, но и не может ее устранить. Вы должны сделать это вручнуюusing System.Web.Mvc.Html;
. Просто так ты знаешь.В ASP.NET MVC 5.1 они добавили
EnumDropDownListFor()
помощника, поэтому нет необходимости в пользовательских расширениях:Модель :
Просмотр :
Использование Tag Helper (ASP.NET MVC 6) :
источник
Я столкнулся с той же проблемой, нашел этот вопрос и подумал, что решение, предложенное Эшем, было не тем, что я искал; Самостоятельное создание HTML означает меньшую гибкость по сравнению со встроенной
Html.DropDownList()
функцией.Оказывается, C # 3 и т. Д. Делает это довольно легко. Я
enum
позвонилTaskStatus
:Это создает хороший старый код,
SelectList
который можно использовать так же, как вы привыкли в представлении:Анонимный тип и LINQ делают это намного более элегантным ИМХО. Не обижайся, Эш. :)
источник
select new { ID = (int)s, Name = s.ToString() };
Вот лучшее инкапсулированное решение:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Скажи, вот твоя модель:
Пример использования:
Сгенерированный интерфейс:
И сгенерированный HTML
Снимок исходного кода Helper Extension:
Вы можете скачать образец проекта по ссылке, которую я предоставил.
РЕДАКТИРОВАТЬ: Вот код:
источник
Html.DropDownListFor требует только IEnumerable, поэтому альтернатива решению Prise заключается в следующем. Это позволит вам просто написать:
[Где SelectedItemType - это поле в вашей модели типа ItemTypes, а ваша модель не равна нулю]
Кроме того, вам не нужно генерировать метод расширения, так как вы можете использовать enumValue.GetType () вместо typeof (T).
РЕДАКТИРОВАТЬ: интегрированное решение Саймона здесь, а также включил метод расширения ToDescription.
источник
Так что без функций расширения, если вы ищете простой и легкий .. Это то, что я сделал
где XXXXX.Sites.YYYY.Models.State - это перечисление
Вероятно, лучше сделать вспомогательную функцию, но когда времени мало, работа будет выполнена.
источник
Расширяя ответы Prize и Rune, если вы хотите, чтобы атрибут value ваших элементов списка выбора соответствовал целочисленному значению типа Enumeration, а не строковому значению, используйте следующий код:
Вместо того, чтобы рассматривать каждое значение Enumeration как объект TEnum, мы можем рассматривать его как объект и затем приводить его к целому числу, чтобы получить распакованное значение.
Замечания: я также добавил ограничение общего типа, чтобы ограничить типы, для которых это расширение доступно только для структур (базовый тип Enum), и проверку типа во время выполнения, которая гарантирует, что переданная структура действительно является Enum.
Обновление 23.10.12: добавлен параметр общего типа для базового типа и исправлена проблема некомпиляции, затрагивающая .NET 4+.
источник
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
не компилируется :(Для решения проблемы получения числа вместо текста используется метод расширения Prise.
источник
e
вint
.ID = Convert.ToInt32(e)
.Очень простой способ сделать это - без лишних расширений, которые кажутся излишними:
Ваше перечисление:
Внутри вашего контроллера привязать Enum к списку:
После этого бросьте его в ViewBag:
Наконец, просто привязать его к представлению:
Это самый простой способ, который я нашел, и он не требует никаких расширений или чего-то такого безумного.
ОБНОВЛЕНИЕ : См. Комментарий Эндрюса ниже.
источник
Level1 = 1
, то значение выпадающего будет"Level1"
вместо1
.Лучшее решение, которое я нашел для этого, объединяло этот блог с ответом Саймона Голдстоуна .
Это позволяет использовать enum в модели. По сути, идея состоит в том, чтобы использовать целочисленное свойство, а также перечисление и эмулировать целочисленное свойство.
Затем используйте атрибут [System.ComponentModel.Description] для аннотирования модели отображаемым текстом и используйте расширение «EnumDropDownListFor» в своем представлении.
Это делает вид и модель очень удобочитаемыми и удобными в обслуживании.
Модель:
Посмотреть:
Расширение (непосредственно из ответа Саймона Голдстоуна , включенное здесь для полноты):
источник
Вы хотите посмотреть, используя что-то вроде
Enum.GetValues
источник
источник
Это ответы Rune & Prize, измененные для использования
int
значения Enum в качестве идентификатора.Образец Enum:
Метод расширения:
Пример использования:
Не забудьте импортировать пространство имен, содержащее метод Extension
Образец сгенерированного HTML:
Обратите внимание, что элемент, который вы используете для вызова,
ToSelectList
является выбранным элементом.источник
Id = Convert.ToInt32(e)
.Это версия для Razor:
источник
В .NET Core вы можете просто использовать это:
источник
<select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
.Теперь эта функция поддерживается из коробки в MVC 5.1 через
@Html.EnumDropDownListFor()
Проверьте следующую ссылку:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
Это действительно позор, что Microsoft потребовалось 5 лет, чтобы реализовать такую функцию, которая так востребована в соответствии с голосованием выше!
источник
Основываясь на ответе Саймона, аналогичный подход заключается в том, чтобы значения Enum отображались из файла ресурсов, а не в атрибуте описания в самом Enum. Это полезно, если ваш сайт должен отображаться более чем на одном языке, и если у вас должен быть определенный файл ресурсов для Enums, вы можете сделать еще один шаг и иметь только значения Enum в вашем Enum и ссылаться на них из расширения с помощью соглашение, такое как [EnumName] _ [EnumValue] - в конечном итоге меньше печатать!
Расширение тогда выглядит так:
Ресурсы в файле Enums.Resx, выглядящие как ItemTypes_Movie: Film
Еще одна вещь, которую мне нравится делать, - вместо того, чтобы напрямую вызывать метод расширения, я бы предпочел вызывать его с помощью @ Html.EditorFor (x => x.MyProperty) или, в идеале, просто иметь целую форму в одном аккуратном @ Html.EditorForModel (). Для этого я изменяю шаблон строки, чтобы он выглядел так
Если это вас интересует, я разместил гораздо более подробный ответ здесь в своем блоге:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
источник
Что ж, я действительно опаздываю на вечеринку, но для чего бы то ни было, я написал блог об этой самой теме, благодаря которой я создаю
EnumHelper
класс, который позволяет очень легко трансформироваться.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
В вашем контроллере:
По вашему мнению:
Вспомогательный класс:
источник
Я опаздываю на этот раз, но я нашел действительно классный способ сделать это с помощью одной строки кода, если вы счастливы добавить пакет Unconstrained Melody NuGet (симпатичная небольшая библиотека от Jon Skeet).
Это решение лучше, потому что:
Итак, вот шаги, чтобы заставить это работать:
Добавьте свойство на вашей модели так:
Теперь, когда у вас есть список SelectListItem, представленный в вашей модели, вы можете использовать @ Html.DropDownList или @ Html.DropDownListFor, используя это свойство в качестве источника.
источник
Еще одно исправление этого метода расширения - текущая версия не выбирала текущее значение перечисления. Я исправил последнюю строку:
источник
Если вы хотите добавить поддержку локализации, просто измените метод s.toString () на что-то вроде этого:
Здесь typeof (Resources) - это ресурс, который вы хотите загрузить, и затем вы получите локализованную строку, также полезную, если ваш перечислитель имеет значения с несколькими словами.
источник
Это моя версия вспомогательного метода. Я использую это:
Вместо этого:
Вот:
источник
Вы также можете использовать мои собственные HtmlHelpers в Griffin.MvcContrib. Следующий код:
Формирует:
https://github.com/jgauffin/griffin.mvccontrib
источник
Я хотел бы ответить на этот вопрос по-другому, когда пользователю не нужно ничего делать
controller
илиLinq
выражать. Сюда...у меня есть
ENUM
Теперь я могу просто создать
dropdown
с помощью этогоenum
.ИЛИ
Если вы хотите сделать индекс выбранным, попробуйте это
Здесь я использовал
AccessLevelEnum.NoAccess
дополнительный параметр для выбора по умолчанию.источник
Я нашел ответ здесь . Однако некоторые из моих перечислений имеют
[Description(...)]
атрибуты, поэтому я изменил код, чтобы обеспечить поддержку этого:Надеюсь, это поможет.
источник
@Simon Goldstone: Спасибо за ваше решение, оно может быть идеально применено в моем случае. Единственная проблема заключается в том, что мне пришлось перевести его на VB. Но теперь это сделано, и чтобы сэкономить время других людей (в случае, если им это нужно), я поместил это здесь:
Конец Вы используете это так:
источник
Я закончил тем, что создал методы расширения, чтобы сделать то, что по сути является ответом здесь. Последняя половина Gist посвящена Enum конкретно.
https://gist.github.com/3813767
источник
источник
источник