Eu tenho uma propriedade no meu modelo chamada "Promoção" cujo tipo é uma enumeração de bandeira chamada "UserPromotion". Os membros da minha enum têm atributos de exibição definidos da seguinte maneira:
[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
}
Agora, quero poder criar digamos um ul na minha opinião para mostrar os valores selecionados da minha propriedade "Promoção". Foi o que fiz até agora, mas o problema é que como posso obter os nomes para exibição aqui?
<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
fonte
fonte
System.ComponentModel.DataAnnotations.DisplayAttribute
. NãoSystem.ComponentModel.DisplayNameAttribute
.Respostas:
ATUALIZAR
A primeira solução foi focada em obter nomes de exibição do enum. O código abaixo deve ser a solução exata para o seu problema.
Você pode usar esta classe auxiliar para enumerações:
E então você pode usá-lo em sua exibição da seguinte maneira:
Espero que ajude! :)
fonte
.ToString
, mas em stackoverflow.com/q/483794/179311 , ele diz para usarEnum.GetName
.GetDisplayValue
que você deve primeiro testedescriptionAttributes == null
antes de tentar acessar a matriz:descriptionAttributes[0]
. Caso contrário, você poderá gerar uma exceção e a linha abaixo, onde você verifica nulo, nunca será verdadeira.Um revestimento - Sintaxe fluente
Exemplo
Resultado
fonte
.NET Framework 4.5
e que você está incluindo os seguintes namespacesSystem.Net
System.ComponentModel.DataAnnotations
GetAttribute<TAttribute>
uma convenção de nomes terrível? Ele recupera o atributo que você especifica e usa maiúsculas e minúsculas pascal como todos os métodos públicos devem.Com base na grande resposta de Aydin , aqui está um método de extensão que não requer nenhum parâmetro de tipo.
NOTA: GetName () deve ser usado em vez da propriedade Name. Isso garante que a cadeia localizada será retornada se estiver usando a propriedade de atributo ResourceType.
Exemplo
Para usá-lo, basta referenciar o valor enum na sua exibição.
Resultado
Promoção: Enviar ofertas de emprego por e-mail
fonte
@Html.DisplayFor(m => m.myEnum.GetDisplayName())
, por exemplo, o que não funcionará, porque eles esperam que a expressão avaliada produza uma propriedade ou algo parecido.Você deve usar o valor de enum bare como no exemplo acima.GetCustomAttribute<DisplayAttribute>()
porque, para alguns Enums, talvez isso não esteja presente. Faz parte deenumValue.ToString()
se o DisplayAttribute não estava presente.List<SelectListItem>
que foi preenchido por um Enum com todas asDisplayAttribute.Name
anotações individuais - isso funcionou perfeitamente, obrigado !!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() }); }
Com base na resposta de Aydin, eu sugeriria uma implementação menos "duvidosa" (porque poderíamos facilmente obter
Type
oEnum
valor do próprio valor, em vez de fornecê-lo como um parâmetro 😉:EDIT (baseado no comentário de @Vahagn Nahapetyan)
Agora podemos usá-lo muito limpo desta maneira:
O que resulta em
fonte
this
deve ser um valor Enum válido (não nulo). Caso contrário, a chamada do método já seria lançada (que é de responsabilidade do código de chamada). Isso faz com queGetType()
, com certeza, forneça o tipo de enum correto no qual,enumvalue
com certeza, será um membro. Mas GetCustomAttribute pode retornar um valor nulo, por isso forneci uma versão não excepcional do método para retornar nulo quando a cadeia de chamadas de método tiver um valor de retorno nulo em algum lugar. Obrigado!Se você estiver usando o MVC 5.1 ou superior, existe uma maneira mais simples e clara: basta usar a anotação de dados (do
System.ComponentModel.DataAnnotations
espaço para nome) como abaixo:E, em vista, basta colocá-lo no auxiliar html adequado:
fonte
Você pode usar o método Type.GetMember e obter as informações do atributo usando a reflexão:
Havia alguns posts semelhantes aqui:
Obtendo atributos do valor de Enum
Como fazer o MVC3 DisplayFor mostrar o valor do atributo de exibição de um Enum?
fonte
Com base na grande resposta de Todd, que se baseia na grande resposta de Aydin , aqui está um método de extensão genérico que não requer nenhum parâmetro de tipo.
Eu precisava disso para o meu projeto, porque algo como o código abaixo, onde nem todos os membros da enum têm um
DisplayAttribute
, não funciona com a solução de Todd:Se esta for uma solução complicada para um problema simples, entre em contato, mas essa foi a correção que usei.
fonte
fonte
InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
Eu tenho duas soluções para esta pergunta.
fonte
Para o ASP.Net Core 3.0, isso funcionou para mim (crédito aos respondentes anteriores).
Minha classe Enum:
Classe de modelo My View:
Um exemplo de uma exibição de navalha exibindo um rótulo e uma lista suspensa. Observe que a lista suspensa não requer um método auxiliar:
fonte
Você precisa usar um pouco de reflexão para acessar esse atributo:
Eu recomendo agrupar esse método em um método de extensão ou executá-lo em um modelo de exibição.
fonte
Com o Core 2.1,
fonte
combinando todos os casos de borda acima:
Equals
,ToString
)Display
atributo opcionalaqui está o meu código:
fonte
Sinto muito por fazer isso, mas não pude usar nenhuma das outras respostas como está e não tenho tempo para discutir isso nos comentários.
Usa sintaxe C # 6.
fonte
Desenvolvendo ainda mais as respostas de Aydin e Todd, aqui está um método de extensão que também permite que você obtenha o nome de um arquivo de recurso
e use-o como
fonte
Quero contribuir com a extensão de enumeração GetDisplayName dependente da cultura. Espero que isso seja útil para qualquer pessoa pesquisando esta resposta como eu anteriormente:
"standart", como Aydin Adn e Todd mencionaram:
Maneira "dependente da cultura":
fonte
Atualização 2020: Uma versão atualizada da função fornecida por muitos neste segmento, mas agora para o C # 7.3 em diante:
Agora você pode restringir métodos genéricos a tipos de enumerações para poder escrever uma única extensão de método para usá-la com todas as enumerações desta forma:
O método de extensão genérico:
O enum:
Como usá-lo:
Bônus, enumerações com sinalizadores: se você estiver lidando com enumerações normais, a função acima é suficiente, mas se alguma de suas enumerações puder assumir vários valores com o uso de sinalizadores, será necessário modificá-lo desta forma (este código usa C # 8 recursos):
A enumeração com bandeiras:
Como usá-lo:
fonte
Com base nas respostas anteriores, criei este ajudante confortável para oferecer suporte a todas as propriedades DisplayAttribute de maneira legível:
fonte
Eu tentei fazer isso como uma edição, mas ela foi rejeitada; Não vejo o porquê.
O exemplo acima lançará uma exceção se você chamá-lo com um Enum que possui uma mistura de atributos personalizados e itens simples, por exemplo
Portanto, modifiquei o código levemente para verificar atributos personalizados antes de tentar acessá-los e usar o nome se nenhum for encontrado.
fonte
Usando o MVC5, você pode usar:
então, se você deseja criar um seletor suspenso, pode usar:
fonte