107 votes

Attributs HTML conditionnels utilisant Razor MVC3

La variable strCSSClass a souvent une valeur, mais il est parfois vide.

Je ne veux pas d'inclure une classe vide="" dans cette entrée de l'élément HTML, ce qui signifie que si strCSSClass est vide, je ne veux pas l'attribut class= à tous.

Ce qui suit est une façon de le faire conditionnelle d'un attribut HTML:

<input type="text" id="@strElementID" @(CSSClass.IsEmpty() ? "" : "class=" + strCSSClass) />

Est-il une façon plus élégante de le faire? Plus précisément celui où j'ai pu suivre la même syntaxe que celle utilisée dans les autres parties de l'element: class="@strCSSClass" ?

170voto

Erik Porter Points 1318

Vous ne l'avez pas entendu parler de moi, PM de Razor, mais dans Razor 2 (Web Pages 2 et MVC 4), des attributs conditionnels sont intégrés à Razor (à partir de MVC 4 RC testé avec succès). Vous pouvez donc simplement indiquer des choses comme ça ...

 <input type="text" id="@strElementID" class="@strCSSClass" />
 

Si strCSSClass est null, l'attribut de classe ne sera pas rendu du tout.

SSSHHH ... ne le dis pas. :)

136voto

AaronLS Points 12720

Remarque: vous pouvez faire quelque chose comme ceci(au moins dans MVC3):

<td align="left" @(isOddRow ? "class=TopBorder" : "style=border:0px") >

et Rasoir comme par magie ajoute les citations imbriquées, la conversion d' class=TopBorder en class="TopBorder"

<td align="left" class="TopBorder" >

OU

<td align="left" style="border:0px" >

Cela peut vraiment vous passionner parce que si vous essayez d'utiliser certaines des conventions habituelles pour les citations imbriquées, vous vous retrouverez avec plus de citations que vous négocié :/

Une autre option, si vous avez des espaces ou vous voulez apporter votre propre guillemets au lieu d'espérer de Rasoir magique en citant les travaux que vous attendez:

<td @Html.Raw( someBoolean ? "rel='tooltip' data-container='.drillDown a'" : "" )>

Rendu sous la forme:

<td rel='tooltip' title='Drilldown' data-container='.drillDown a'>

Méfiez-vous que cette dernière technique peut vous exposer à certains problèmes de sécurité si le bâtiment de chaînes à partir de données fournies par les utilisateurs. E. g. si vous avez construit un attribut à partir de champs de données qui proviennent de données fournies par les utilisateurs, l'utilisation de Html.Raw signifie que la chaîne peut contenir une fin prématurée de l'attribut et de la balise, puis commencer une balise de script qui fait quelque chose au nom de l'utilisateur actuellement connecté(éventuellement différent de l'utilisateur connecté). Peut-être que vous avez une page avec une liste de tous les utilisateurs des photos et que vous définissez une info-bulle le nom de chaque personne, et l'un des utilisateurs est nommé lui-même '/><script>$.post('changepassword.php?password=123')</script> et maintenant, de tout autre utilisateur qui consulte cette page a leur mot de passe instantanément changé un mot de passe que l'utilisateur malveillant sait.

14voto

Yaschur Points 169

Je suppose qu'un moyen un peu plus pratique et structuré consiste à utiliser HTML helper. À votre avis, cela peut ressembler à:

 @{
 var htmlAttr = new Dictionary<string, object>();
 htmlAttr.Add("id", strElementId);
 if (!CSSClass.IsEmpty())
 {
   htmlAttr.Add("class", strCSSClass);
 }
}

@* ... *@

@Html.TextBox("somename", "", htmlAttr)
 

Si cela vous est utile, je vous recommande de définir le dictionnaire htmlAttr dans votre modèle afin que votre affichage ne nécessite aucun bloc logique @{ } (soyez plus clair).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X