Tengo una propiedad en mi modelo llamada "Promoción" que su tipo es una enumeración de bandera llamada "UserPromotion". Los miembros de mi enumeración tienen atributos de visualización establecidos de la siguiente manera:
[Flags]
public enum UserPromotion
{
None = 0x0,
[Display(Name = "Send Job Offers By Mail")]
SendJobOffersByMail = 0x1,
[Display(Name = "Send Job Offers By Sms")]
SendJobOffersBySms = 0x2,
[Display(Name = "Send Other Stuff By Sms")]
SendPromotionalBySms = 0x4,
[Display(Name = "Send Other Stuff By Mail")]
SendPromotionalByMail = 0x8
}
Ahora quiero poder crear say a ul en mi vista para mostrar los valores seleccionados de mi propiedad "Promoción". Esto es lo que he hecho hasta ahora, pero el problema es que ¿cómo puedo obtener los nombres para mostrar aquí?
<ul>
@foreach (int aPromotion in @Enum.GetValues(typeof(UserPromotion)))
{
var currentPromotion = (int)Model.JobSeeker.Promotion;
if ((currentPromotion & aPromotion) == aPromotion)
{
<li>Here I don't know how to get the display attribute of "currentPromotion".</li>
}
}
</ul>
c#
asp.net-mvc
razor
displayattribute
Pejman
fuente
fuente
System.ComponentModel.DataAnnotations.DisplayAttribute
. NoSystem.ComponentModel.DisplayNameAttribute
.Respuestas:
ACTUALIZAR
La primera solución se centró en obtener nombres para mostrar de enum. El siguiente código debe ser la solución exacta para su problema.
Puede usar esta clase auxiliar para enumeraciones:
Y luego puede usarlo en su vista de la siguiente manera:
¡Espero eso ayude! :)
fuente
.ToString
, pero desde stackoverflow.com/q/483794/179311 , dice usarEnum.GetName
en su lugar.GetDisplayValue
primer lugar debería pruebadescriptionAttributes == null
antes de intentar acceder a la matriz:descriptionAttributes[0]
. De lo contrario, puede plantear una excepción y la línea a continuación donde verifica si es nula nunca será cierta.One liner - Sintaxis fluida
Ejemplo
Salida
fuente
.NET Framework 4.5
y que incluya los siguientes espacios de nombresSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
una convención de nombres terrible? Recupera el atributo que especifique y utiliza la carcasa pascal como deberían hacerlo todos los métodos públicos.Sobre la base de la gran respuesta de Aydin , aquí hay un método de extensión que no requiere ningún tipo de parámetro.
NOTA: GetName () debe usarse en lugar de la propiedad Name. Esto garantiza que la cadena localizada se devolverá si se usa la propiedad de atributo ResourceType.
Ejemplo
Para usarlo, solo haga referencia al valor de enumeración en su vista.
Salida
Promoción: envíe ofertas de trabajo por correo
fuente
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
, que no funcionará, porque esperan que la expresión evaluada produzca una propiedad o algo similar. Debe usar el valor de enumeración simple como en el ejemplo anterior.GetCustomAttribute<DisplayAttribute>()
Agregué una verificación de referencia nula al resultado de porque para algunas Enums tal vez esto no esté presente. Vuelve aenumValue.ToString()
si DisplayAttribute no estaba presente.List<SelectListItem>
un Enum poblado por un Enum con todas lasDisplayAttribute.Name
anotaciones individuales . ¡Esto funcionó perfectamente, gracias!public List<SelectListItem> MySelectListItem = new List<SelectListItem>(); foreach (MyEnum MyEnum in Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Where(x => x != MyEnum.Default)) { MySelectListItem.Add(new SelectListItem() { Text = MyEnum.GetDisplayName(), Value = ((int)MyEnum).ToString() }); }
Basado en la respuesta de Aydin, sugeriría una implementación menos "duplicativa" (porque podríamos obtener fácilmente
Type
elEnum
valor en sí mismo, en lugar de proporcionarlo como un parámetro 😉:EDITAR (basado en el comentario de @Vahagn Nahapetyan)
Ahora podemos usarlo muy limpio de esta manera:
Lo que resulta en
fuente
this
debe ser un valor Enum válido (no nulo). De lo contrario, llamar al método ya arrojaría (que es responsabilidad del código de llamada). Esto hace queGetType()
seguramente proporcione el tipo de enumeración correcto en el queenumvalue
seguramente será miembro. Pero GetCustomAttribute podría devolver un valor nulo, por lo que proporcioné una versión no excepcional del método para devolver nulo cuando la cadena de llamadas de método tiene un valor de retorno nulo en alguna parte. ¡Gracias!Si está utilizando MVC 5.1 o superior, hay una manera más simple y clara: simplemente use la anotación de datos (del
System.ComponentModel.DataAnnotations
espacio de nombres) como se muestra a continuación:Y a la vista, simplemente colóquelo en el html helper apropiado:
fuente
Puede usar el Método Type.GetMember , luego obtener la información del atributo usando la reflexión:
Hubo algunas publicaciones similares aquí:
Obteniendo atributos del valor de Enum
¿Cómo hacer que MVC3 DisplayFor muestre el valor de un atributo de visualización de Enum?
fuente
Sobre la base de la gran respuesta de Todd, que se basa en la gran respuesta de Aydin , aquí hay un método de extensión genérico que no requiere ningún tipo de parámetro.
Necesitaba esto para mi proyecto porque algo como el siguiente código, donde no todos los miembros de la enumeración tienen
DisplayAttribute
, no funciona con la solución de Todd:Si esta es una solución complicada a un problema simple, avíseme, pero esta fue la solución que usé.
fuente
fuente
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Tengo dos soluciones para esta pregunta.
fuente
Para ASP.Net Core 3.0, esto funcionó para mí (crédito a respuestas anteriores).
Mi clase de Enum:
Mi clase de modelo de vista:
Un ejemplo de una vista de afeitar que muestra una etiqueta y una lista desplegable. Observe que la lista desplegable no requiere un método auxiliar:
fuente
Debe usar un poco de reflexión para acceder a ese atributo:
Recomiendo envolver este método en un método de extensión o realizar esto en un modelo de vista.
fuente
Con Core 2.1,
fuente
combinando todos los casos de borde juntos desde arriba:
Equals
,ToString
)Display
atributo opcionalAquí está mi código:
fuente
Lamento hacer esto, pero no pude usar ninguna de las otras respuestas tal cual y no tengo tiempo para dudarlo en los comentarios.
Utiliza la sintaxis C # 6.
fuente
Basándose en las respuestas de Aydin y Todd, aquí hay un método de extensión que también le permite obtener el nombre de un archivo de recursos
y úsalo como
fuente
Quiero contribuir con la extensión de enumeración GetDisplayName dependiente de la cultura. Espero que esto sea útil para cualquiera que busque en Google esta respuesta como yo anteriormente:
"estándar" como Aydin Adn y Todd mencionaron:
Forma "dependiente de la cultura":
fuente
Actualización 2020: una versión actualizada de la función proporcionada por muchos en este hilo pero ahora para C # 7.3 en adelante:
Ahora puede restringir los métodos genéricos a tipos de enumeraciones para que pueda escribir una sola extensión de método para usarla con todas sus enumeraciones de esta manera:
El método de extensión genérico:
La enumeración:
Cómo usarlo:
Bono, enumeraciones con banderas: si se trata de enumeraciones normales, la función anterior es suficiente, pero si alguna de sus enumeraciones puede tomar múltiples valores con el uso de indicadores, deberá modificarla de esta manera (este código usa C # 8 caracteristicas):
La enumeración con banderas:
Cómo usarlo:
fuente
Según las respuestas anteriores, he creado este cómodo ayudante para admitir todas las propiedades DisplayAttribute de una manera legible:
fuente
Intenté hacer esto como una edición pero fue rechazado; No puedo ver por qué.
Lo anterior arrojará una excepción si lo llama con una enumeración que tiene una combinación de atributos personalizados y elementos simples, por ejemplo
Así que modifiqué el código muy ligeramente para verificar los atributos personalizados antes de intentar acceder a ellos y usar el nombre si no se encuentra ninguno.
fuente
Usando MVC5 podría usar:
entonces, si desea crear un selector desplegable, puede usar:
fuente