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> 
59
demandé sur Mahesh 2012-02-22 21:07:36

5 réponses

MVC a des attributs conditionnels intégrés...

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

Si @myClass est null, il n'utilisera tout simplement pas l'attribut du tout...

Je sais que cela ne résoudra peut-être pas tout à fait votre problème actuel, mais c'est remarquable!

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

106
répondu jcreamer898 2018-07-10 06:36:41
<li class="@(ViewBag.pagename == "Business details" ? "active" : null)">  

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

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

61
répondu SLaks 2012-02-22 17:10:03

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 est évaluée à 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éfini, 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, sinon omettra l'attribut class entier.

18
répondu defrost 2014-04-09 20:30:27

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/

2
répondu David Slavík 2013-01-30 11:27:07

Approche avec la méthode D'extension TagWrap. Le Code de votre question ressemblerait à ceci:

@using (Html.TagWrap("li", condition ? new { @class = "active" } : null))
{
    var anchorAttrs = new Dictionary<string, object> { { "href", Url.Action("BusinessDetails", "Business") } };
    if(condition)
    {
        anchorAttrs["style"] = "color: white; background-color: #08C; border: 1px solid #08C;";
    }
    using (Html.TagWrap("a", anchorAttrs))
    {
        <text>Business Details</text>
    }
}

Méthodes D'extension TagWrap

Utilisation De Microsoft.AspNetCore.Mvc.ViewFeatures;

public static IDisposable TagWrap(this IHtmlHelper htmlHelper, string tagName, object data)
{
    return htmlHelper.TagWrap(tagName, HtmlHelper.AnonymousObjectToHtmlAttributes(data));
}

public static IDisposable TagWrap(this IHtmlHelper htmlHelper, string tagName, IDictionary<string, object> data)
{
    var tag = new TagBuilder(tagName);
    tag.MergeAttributes(data);

    htmlHelper.ViewContext.Writer.Write(tag.RenderStartTag());

    return new DisposableAction(() =>
        htmlHelper.ViewContext.Writer.Write(tag.RenderEndTag()));
}

Classe D'aide utilisée pour le rendu de la balise de fermeture sur Dispose

public class DisposableAction : IDisposable
{
    private readonly Action DisposeAction;

    public DisposableAction(Action action)
    {
        DisposeAction = action;
    }

    public void Dispose()
    {
        DisposeAction();
    }
}
0
répondu Pavlo Neyman 2018-07-10 06:31:33