Самый чистый способ иметь встроенные блоки кода с помощью механизма просмотра ASP.NET Razor?

Это работает:

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

Но это уродливо... Есть ли лучший, более чистый способ сделать это? в этом коде я проверяю, является ли какой-то вид данных нулевым или пустым, если так добавить класс.

Или существует ли еще один способ достижения этого лучше?

Ответ 1

Вчера я опубликовал некоторые методы расширения HTML, которые обрабатывают такие вещи:

Как сжато создать дополнительные атрибуты HTML с движком просмотра бритвы?

Используя этот подход, вы получите следующий синтаксис Razor:

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

ПРИМЕЧАНИЕ. Вы можете связать атрибуты вместе, чтобы создать значения атрибутов на основе нескольких условий. Например:

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

выводит:

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

Кроме того, если результирующее значение атрибута пусто, атрибут будет рухнуть, чтобы сохранить ваш html.

Ответ 2

Или вы можете сделать что-то вроде этого:

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

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

Ответ 3

Как использовать тернарный оператор для вычисления выражения следующим образом:

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

Ответ 4

Используя метод в разделе @functions:

@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)))

Ответ 5

Я бы сказал, что вы можете просто добавить класс к своей модели

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

Это очистит его...

Убрал второй пример, поскольку понял, что он не будет работать