2010-11-16 6 views
13

Dies funktioniert:Sauberste Möglichkeit, Inline-Codeblöcke mit der ASP.NET Razor View Engine zu verwenden?

<li @{if (Model.Mode == "map") {<text> class="bselected"</text>}}>@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 

Aber es ist hässlich ... Gibt es einen besseren, sauberere Weg, dies zu tun? In diesem Code überprüfe ich, ob einige Ansichtsdaten null oder leer sind. Wenn ja, füge eine Klasse hinzu.

Oder gibt es eine andere Technik, um dies besser zu erreichen?

Antwort

15

ich einige HTML-Erweiterung Methoden gestern geschrieben, dass diese Art der Sache umgehen:

How to concisely create optional HTML attributes with razor view engine?

Mit diesem Ansatz erhalten Sie die folgende Razor-Syntax:

<li @Html.Css("selected", Model.Mode == "map")>STUFF</li> 

HINWEIS: Sie können Attribute zusammenketten, um Attributwerte basierend auf mehreren Bedingungen aufzubauen. Zum Beispiel:

<li @Html.Css("selected", true).Add("winner", false).Add("last", true)>STUFF</li> 

ausgeben würde:

<li class="selected last">STUFF</li> 

Auch, wenn der resultierende Attributwert leer ist das Attribut Ihre HTML ordentlich halten kollabiert.

+0

Das ist sehr nett, ich mag diesen Ansatz - sehr jQuery wie. : D Ich werde das auf jeden Fall überprüfen. – Chaddeus

0

Ich würde wahrscheinlich sagen, Sie könnten nur die Klasse zu Ihrem Modell hinzufügen

<li class="@Model.Selected">@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 

, dass es bis reinigen würde ...

entfernt zweites Beispiel, wie ich es realisiert wird nicht funktionieren

+0

Ich mag, wohin Sie damit gehen, aber ich möchte vermeiden, leere Klasse = "" in meiner Ausgabe, wenn es nicht das ausgewählte Element ist. – Chaddeus

+0

Sie können entweder ein von Simon oder mir zur Verfügung gestelltes Beispiel verwenden ... Sie geben dem Modell dann nur Ihre vollständige Klassendefinition oder Sie tun, was Simon mit der vollen Klassendefinition tat – Buildstarted

+0

Das stimmt ... danke! – Chaddeus

12

Oder man könnte so etwas tun:

@{ 
    var cssClass = (Model.Mode == "map") ? "selected" : ""; 
} 

<li class="@cssClass">@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 
+1

heh, du musst das wahrscheinlich in 'var @class = ...' ändern, da class ein Schlüsselwort ist. und dein li muss '@ (@ class) sein' – Buildstarted

+0

Ah, natürlich - ich hätte das sehen sollen! Danke, dass du das unterstrichen hast! Stattdessen habe ich es in cssClass umbenannt, um die Dinge schön aussehen zu lassen :) –

+0

Ja, das ist viel besser als '@ (@' :) – Buildstarted

2

Wie wäre es ein ternäres operat mit oder einen Ausdruck evalate wie folgt:

<li @(Model.Mode == "map" ? "class='bselected' : "")>@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li> 
2

ein Verfahren, in dem @Funktionen Abschnitt Verwendung:

@functions{ 
    public HtmlString Li(bool selected, IHtmlString template) { 
     var result = string.Format("<li{0}>{1}</li>", 
     selected ? " class='selected'" : "")), 
     template); 
     return new HtmlString(result); 
    } 
} 

@* ... *@ 

@Li(Model.Mode == "map", Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty)))