Embora a Microsoft tenha criado uma renderização automagica de atributos html no MVC4, demorei bastante tempo para descobrir como renderizar uma segunda classe css em um elemento, com base em uma expressão condicional do razor. Eu gostaria de compartilhar com você.
Com base na propriedade model @ Model.Details, quero mostrar ou ocultar um item da lista. Se houver detalhes, uma div deve ser mostrada; caso contrário, ela deve estar oculta. Usando o jQuery, tudo o que preciso fazer é adicionar um show de classe ou ocultar, respectivamente. Para outros fins, também quero adicionar outra classe, "detalhes". Portanto, minha marcação deve ser:
<div class="details show">[Details]</div>
ou <div class="details hide">[Details]</div>
Abaixo, mostro algumas tentativas com falha (marcação resultante, assumindo que não há detalhes).
Este: <div @(@Model.Details.Count > 0 ? "class=details show" : "class=details hide")>
,
vai tornar este: <div class="details" hide="">
.
Este: <div @(@Model.Details.Count > 0 ? "class=\"details show\"" : "class=\"details hide\"")>
.
vai tornar este: <div class=""details" hide"="">
.
Este: <div @(@Model.Details.Count > 0 ? "class='details show'" : "class='details hide'")>
vai tornar este: <div class="'details" hide'="">
.
Nenhuma dessas marcações está correta.
fonte
Respostas:
Eu acredito que ainda pode haver uma lógica válida nas visualizações. Mas para esse tipo de coisa que eu concordo com o @BigMike, é melhor colocado no modelo. Dito isto, o problema pode ser resolvido de três maneiras:
Sua resposta (supondo que isso funcione, eu não tentei isso):
Segunda opçao:
Terceira opção:
fonte
The "div" element was not closed
'ClubsModel' does not contain a definition for 'ClubsFilter' and no extension method 'ClubsFilter' accepting a first argument of type 'ClubsModel' could be found (are you missing a using directive or an assembly reference?)
Este:
irá renderizar isso:
e é a marcação que eu quero.
fonte
@Model.Details.Count > 0
. por exemplo<div class="details @(@Model.HasDetails ? "show" : "hide")">
Você pode adicionar propriedades ao seu modelo da seguinte maneira:
e sua visualização será mais simples e não conterá lógica alguma:
Isso funcionará mesmo com muitas classes e não renderizará a classe se for nulo:
com 2 propriedades não nulas renderizará:
se class1 for nulo
fonte
Você pode usar a função String.Format para adicionar a segunda classe com base na condição:
fonte