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>
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
<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.
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.
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/
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();
}
}