Estoy tratando de usar el Html.DropDownList
método de extensión, pero no puedo entender cómo usarlo con una enumeración.
Digamos que tengo una enumeración como esta:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
¿Cómo hago para crear un menú desplegable con estos valores usando el Html.DropDownList
método de extensión?
¿O es mi mejor apuesta simplemente crear un bucle for y crear los elementos HTML manualmente?
c#
asp.net
asp.net-mvc
Kevin Pang
fuente
fuente
ASP.NET MVC
hay una forma nativa: stackoverflow.com/a/22295360/1361084Sé que llego tarde a la fiesta en esto, pero pensé que podría encontrar esta variante útil, ya que esta también le permite usar cadenas descriptivas en lugar de constantes de enumeración en el menú desplegable. Para hacer esto, decore cada entrada de enumeración con un atributo [System.ComponentModel.Description].
Por ejemplo:
Aquí está mi código:
Luego puede hacer esto desde su punto de vista:
¡Espero que esto te ayude!
** EDITAR 2014-ENE-23: Microsoft acaba de lanzar MVC 5.1, que ahora tiene una función EnumDropDownListFor. Lamentablemente, no parece respetar el atributo [Descripción], por lo que el código anterior sigue en pie. Consulte la sección Enum en las notas de la versión de Microsoft para MVC 5.1.
Actualización: sin embargo, admite el atributo Display
[Display(Name = "Sample")]
, por lo que uno puede usarlo.[Actualización: acabo de notar esto y el código parece una versión extendida del código aquí: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , con un par de adiciones. Si es así, la atribución parecería justa ;-)]
fuente
System.Web.Mvc.Html
, dice queDropDownListFor
no se puede encontrar, pero tampoco puede resolverlo. Tienes que hacer manualmenteusing System.Web.Mvc.Html;
. Solo así que ya sabes.En ASP.NET MVC 5.1 , agregaron el
EnumDropDownListFor()
ayudante, por lo que no se necesitan extensiones personalizadas:Modelo :
Vista :
Usando Tag Helper (ASP.NET MVC 6) :
fuente
Me encontré con el mismo problema, encontré esta pregunta y pensé que la solución provista por Ash no era lo que estaba buscando; Tener que crear el HTML yo mismo significa menos flexibilidad en comparación con la
Html.DropDownList()
función incorporada.Resulta que C # 3 etc. hace que esto sea bastante fácil. Tengo un
enum
llamadoTaskStatus
:Esto crea un buen ol '
SelectList
que se puede usar como está acostumbrado en la vista:El tipo anónimo y LINQ lo hacen mucho más elegante en mi humilde opinión. Sin ofender, Ash. :)
fuente
select new { ID = (int)s, Name = s.ToString() };
Aquí hay una mejor solución encapsulada:
https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5
Digamos que aquí está tu modelo:
Uso de muestra:
IU generada:
Y HTML generado
La instantánea del código fuente de la extensión auxiliar:
Puede descargar el proyecto de muestra desde el enlace que proporcioné.
EDITAR: Aquí está el código:
fuente
Html.DropDownListFor solo requiere un IEnumerable, por lo que una alternativa a la solución de Prise es la siguiente. Esto te permitirá simplemente escribir:
[Donde SelectedItemType es un campo en su modelo de tipo ItemTypes, y su modelo no es nulo]
Además, en realidad no es necesario que genérico el método de extensión, ya que puede usar enumValue.GetType () en lugar de typeof (T).
EDITAR: la solución integrada de Simon aquí también, y el método de extensión ToDescription incluido.
fuente
Entonces, sin funciones de extensión, si estás buscando simple y fácil ... Esto es lo que hice
donde XXXXX.Sites.YYYY.Models.State es una enumeración
Probablemente sea mejor hacer una función auxiliar, pero cuando el tiempo es corto, esto hará el trabajo.
fuente
Ampliando las respuestas de Premio y Runa, si desea que el atributo de valor de los elementos de su lista de selección se asigne al valor entero del tipo Enumeración, en lugar del valor de cadena, use el siguiente código:
En lugar de tratar cada valor de Enumeration como un objeto TEnum, podemos tratarlo como un objeto y luego convertirlo en un entero para obtener el valor sin caja.
Nota: También agregué una restricción de tipo genérico para restringir los tipos para los que esta extensión está disponible solo para estructuras (tipo base de Enum), y una validación de tipo en tiempo de ejecución que garantiza que la estructura que se pasa es realmente una Enum.
Actualización 23/10/12: Se agregó un parámetro de tipo genérico para el tipo subyacente y se solucionó el problema de no compilación que afecta a .NET 4+.
fuente
ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
Value = Convert.ToInt32(e)
.(int)e
no compila :(Para resolver el problema de obtener el número en lugar del texto usando el método de extensión de Prise.
fuente
e
aint
.ID = Convert.ToInt32(e)
.Una forma súper fácil de hacer esto, sin todas las extensiones que parecen excesivas, es esta:
Tu enumeración:
Dentro de su controlador, vincule Enum a una Lista:
Después de eso, tíralo a una ViewBag:
Finalmente, simplemente vincúlelo a la Vista:
Esta es, con mucho, la forma más fácil que encontré y no requiere extensiones ni nada tan loco.
ACTUALIZACIÓN : Vea el comentario de Andrews a continuación.
fuente
Level1 = 1
, entonces el valor del menú desplegable sería en"Level1"
lugar de1
.La mejor solución que encontré para esto fue combinar este blog con la respuesta de Simon Goldstone .
Esto permite el uso de la enumeración en el modelo. Esencialmente, la idea es usar una propiedad entera así como la enumeración y emular la propiedad entera.
Luego use el atributo [System.ComponentModel.Description] para anotar el modelo con su texto de visualización, y use una extensión "EnumDropDownListFor" en su vista.
Esto hace que tanto la vista como el modelo sean muy legibles y mantenibles.
Modelo:
Ver:
Extensión (directamente de la respuesta de Simon Goldstone , incluida aquí para completar):
fuente
Quieres mirar usando algo como
Enum.GetValues
fuente
fuente
Estas son las respuestas de Rune & Prize alteradas para usar el
int
valor Enum como ID.Enum de muestra:
Método de extensión:
Muestra de uso:
Recuerde importar el espacio de nombres que contiene el método de extensión
Muestra de HTML generado:
Tenga en cuenta que el elemento que utiliza para activar
ToSelectList
es el elemento seleccionado.fuente
Id = Convert.ToInt32(e)
.Esta es la versión para Razor:
fuente
En .NET Core puedes usar esto:
fuente
<select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
.Ahora esta característica es compatible desde el primer momento en MVC 5.1 a través de
@Html.EnumDropDownListFor()
Consulta el siguiente enlace:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum
¡Realmente es una pena que Microsoft haya tardado 5 años en implementar esta función, que es tan solicitada de acuerdo con la votación anterior!
fuente
Basándose en la respuesta de Simon, un enfoque similar es hacer que los valores de Enum se muestren desde un archivo de Recursos, en lugar de en un atributo de descripción dentro del Enum. Esto es útil si su sitio necesita ser presentado en más de un idioma y si tuviera un archivo de recursos específico para Enums, podría ir un paso más allá y tener solo los valores de Enum, en su Enum y hacer referencia a ellos desde la extensión una convención como [EnumName] _ [EnumValue] - ¡en última instancia, menos tipeo!
La extensión se ve así:
Recursos en el archivo Enums.Resx que se parecen a ItemTypes_Movie: Film
Otra cosa que me gusta hacer es, en lugar de llamar al método de extensión directamente, prefiero llamarlo con un @ Html.EditorFor (x => x.MyProperty), o idealmente tener todo el formulario, en una ordenada @ Html.EditorForModel (). Para hacer esto, cambio la plantilla de cadena para que se vea así
Si esto le interesa, he puesto una respuesta mucho más detallada aquí en mi blog:
http://paulthecyclist.com/2013/05/24/enum-dropdown/
fuente
Bueno, realmente llego tarde a la fiesta, pero por lo que vale, he blogueado sobre este mismo tema mediante el cual creo una
EnumHelper
clase que permite una transformación muy fácil.http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23
En tu controlador:
En tu vista:
La clase auxiliar:
fuente
Llegué muy tarde en este caso, pero acabo de encontrar una forma realmente genial de hacerlo con una línea de código, si está contento de agregar la Melodía sin restricciones paquete NuGet sin restricciones (una biblioteca pequeña y agradable de Jon Skeet).
Esta solución es mejor porque:
Entonces, estos son los pasos para que esto funcione:
Agregue una propiedad en su modelo así:
Ahora que tiene la lista de elementos SelectListItem expuestos en su modelo, puede usar @ Html.DropDownList o @ Html.DropDownListFor usando esta propiedad como fuente.
fuente
Otra solución a este método de extensión: la versión actual no seleccionó el valor actual de la enumeración. Arreglé la última línea:
fuente
Si desea agregar soporte de localización, simplemente cambie el método s.toString () a algo como esto:
Aquí el tipo de (Recursos) es el recurso que desea cargar, y luego obtiene la Cadena localizada, también útil si su enumerador tiene valores con varias palabras.
fuente
Esta es mi versión del método auxiliar. Yo uso esto:
En lugar de eso:
Aquí está:
fuente
También puede usar mis HtmlHelpers personalizados en Griffin.MvcContrib. El siguiente código:
Genera:
https://github.com/jgauffin/griffin.mvccontrib
fuente
Me gustaría responder a esta pregunta de una manera diferente donde, el usuario no necesita hacer nada
controller
oLinq
expresión. De esta manera...tengo un
ENUM
Ahora puedo simplemente crear un
dropdown
usando estoenum
.O
Si desea seleccionar un índice, intente esto
Aquí lo he usado
AccessLevelEnum.NoAccess
como un parámetro adicional para la selección predeterminada del menú desplegable.fuente
Encontré una respuesta aquí . Sin embargo, algunas de mis enumeraciones tienen
[Description(...)]
atributo, por lo que modifiqué el código para proporcionar soporte para eso:Espero que ayude.
fuente
@ Simon Goldstone: Gracias por su solución, se puede aplicar perfectamente en mi caso. El único problema es que tuve que traducirlo a VB. Pero ahora está hecho y para ahorrar tiempo a otras personas (en caso de que lo necesiten) lo puse aquí:
Fin Lo usas así:
fuente
Terminé creando métodos de extensión para hacer lo que es esencialmente la respuesta de aceptación aquí. La última mitad del Gist trata con Enum específicamente.
https://gist.github.com/3813767
fuente
fuente
fuente