使用ASP.NET Razor视图引擎获得内联代码块的最简洁方法?

时间:2010-11-16 15:43:27

标签: c# syntax razor

这有效:

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

但它很难看......有更好,更清洁的方法吗?在这段代码中,我正在检查某些视图数据是否为空或空,如果是,则添加一个类。

还是有另一种技术可以更好地完成这项工作吗?

5 个答案:

答案 0 :(得分:15)

我昨天发布了一些处理这类事情的Html扩展方法:

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

使用此方法将为您提供以下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整洁。

答案 1 :(得分:12)

或者你可以这样做:

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

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

答案 2 :(得分:2)

如何使用三元运算符评估表达式如下:

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我可能会说你可以把这个类添加到模型中

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

那会清理它......

删除了第二个例子,因为我意识到它不起作用