90 votes

ASP.NET MVC razor : attribut conditionnel en HTML

Le code ci-dessous ne semble pas propre. Une suggestion pour améliorer le code ?

<li @if(ViewData["pagename"].ToString()=="Business details"){ <text>class="active" </text> } >
        <a  @if(ViewData["pagename"].ToString()=="Business details"){ <text>style="color: white; background-color: #08C; border: 1px solid #08C;" </text> }
            href="@Url.Action("BusinessDetails", "Business")">Business Details</a>
    </li> 
    <li @if (ViewData["pagename"].ToString() == "Booking policies"){ <text>class="active"</text> }> 
        <a  @if (ViewData["pagename"].ToString() == "Booking policies")
               { <text>style="color: white; background-color: #08C; border: 1px solid #08C;" </text> }
            href="@Url.Action("BookingPolicies", "Business")">Booking policies</a> 
    </li>

0 votes

Peut-être la création d'une aide HTML personnalisée qui rendrait la LI avec des éléments de liens enfants ?

159voto

jcreamer898 Points 3817

MVC intègre des attributs conditionnels...

<div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>
<div class="@myClass">Content</div>

Si @myClass est nul, l'attribut ne sera pas utilisé du tout...

Je sais que cela ne résout pas tout à fait votre problème actuel, mais cela mérite d'être souligné !

http://weblogs.asp.net/jgalloway/archive/2012/02/16/asp-net-4-beta-released.aspx

0 votes

Veillez à ce que le nom de votre classe ne soit pas "active" ou vous aurez un attribut de classe d'entrée. Je ne sais pas pourquoi.

3 votes

Existe-t-il un moyen d'obtenir le même comportement de respect de l'anonymat lorsque l'on appelle des aides html en passant l'anonymat de l'utilisateur ? htmlProperties objet ? Par exemple, je veux passer conditionnellement l'attribut disabled comme @Html.TextBoxFor(lambda, new { disabled = condition ? true : null }) mais ça rend toujours disabled="" quand disabled était null ce qui revient à rendre disabled="anything" parce que disabled est actif lorsque l'attribut est présent, quelle que soit sa valeur. Trouvé stackoverflow.com/q/7978137/11683 sur le sujet, mais y a-t-il de meilleurs moyens de nos jours, je me le demande ?

2 votes

Remarque : les attributs "data-..." ne peuvent pas être conditionnels et rendent une valeur vide, même pour les valeurs nulles ( stackoverflow.com/questions/13267619/ )

78voto

SLaks Points 391154
<li class="@(ViewBag.pagename == "Business details" ? "active" : null)">  

Vous devez remplacer le texte en ligne style="..." avec un nom de classe séparé et utiliser la même syntaxe.

Cependant, il serait plus propre de créer une méthode d'extension distincte pour l'aide HTML qui prendrait un nom de page et d'action et générerait le HTML de manière générique.

1 votes

Joli, beaucoup plus propre que certaines des autres options (à part l'option Razor 2.0).

23voto

defrost Points 116

J'utilise une petite méthode d'aide qui ajoutera conditionnellement un attribut si la valeur n'est pas vide et, si elle est définie, lorsqu'une expression de fonction booléenne donne la valeur suivante true :

public static MvcHtmlString Attr(this HtmlHelper helper, string name, string value, Func<bool> condition = null)
{
    if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value))
    {
        return MvcHtmlString.Empty;
    }

    var render = condition != null ? condition() : true;

    return render ? 
        new MvcHtmlString(string.Format("{0}=\"{1}\"", name, HttpUtility.HtmlAttributeEncode(value))) : 
        MvcHtmlString.Empty;
}

Une fois définie, je peux utiliser cette méthode dans mes vues Razor :

<li @(Html.Attr("class", "new", () => example.isNew))>
...
</li>

Le code ci-dessus rendra <li class="new">...</li> si example.isNew == true si ce n'est pas le cas, on omettra la totalité de la class attribut.

1 votes

Une façon très élégante de le faire. Mais au lieu de Func<bool> lambda, je préférerai un simple bool? parce que c'est plus simple : <li @Html.Attr("class", "new", example.isNew)>

0 votes

J'aime cette approche car une grande partie du JavaScript personnalisé de mon application s'exécutera quand le nom de l'attribut sera toujours présent. Et au moins, cela ne vous oblige pas à répéter la même division à cause des différences d'attributs. Merci.

5voto

David Slavík Points 284

Dans MVC4

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    @{
        string css = "myDiv";
    }
    <div class='@css'></div>
</body>
</html>

ou

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    @{
        string css = "class=myDiv";
    }
    <div @css></div>
</body>
</html>

Plus sont ici : http://evolpin.wordpress.com/2012/05/20/mvc-4-code-enhancements/

2voto

user4649102 Points 149
@{ var classAttr= needClass ? "class=\"class-name\"" : "" }

et ensuite dans le HTML

<li @Html.Raw(classAttr) >

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