【问题标题】:Cleanest way to have inline code blocks using the ASP.NET Razor view engine?使用 ASP.NET Razor 视图引擎拥有内联代码块的最简洁方法?
【发布时间】:2010-11-16 15:43:26
【问题描述】:

这行得通:

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

但这很丑……有没有更好、更清洁的方法来做到这一点?在这段代码中,我正在检查某些视图数据是否为空或为空,如果是则添加一个类。

或者是否有其他技术可以更好地完成此任务?

【问题讨论】:

    标签: c# syntax razor


    【解决方案1】:

    我昨天发布了一些处理这种事情的 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 整洁。

    【讨论】:

    • 这很好,我喜欢这种方法——非常喜欢 jQuery。 :D 我一定会去看看的。
    【解决方案2】:

    或者你可以这样做:

    @{
        var cssClass = (Model.Mode == "map") ? "selected" : "";
    }
    
    <li class="@cssClass">@Html.ActionLink("Map & Directions", MVC.Biz.Show(Model.SingleBiz.BizName, "map", string.Empty))</li>
    

    【讨论】:

    • 嘿,您可能必须将其更改为 var @class=...,因为 class 是一个关键字。你的 li 必须是 @(@class)
    • 啊,当然 - 我应该看到的!感谢您指出了这一点!相反,我将其重命名为 cssClass 以保持美观:)
    • 是的,这比@(@ 好多了:)
    • 好主意,但是我想避免在我的输出中出现空的 class="" 如果它不是选定的项目。
    【解决方案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>
        

        那会清理它...

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

        【讨论】:

        • 我喜欢你用这个去哪里,但我想避免在我的输出中出现空的 class="" 以防它不是选定的项目。
        • 您可以使用 Simon 或我自己提供的任何一个示例来执行此操作...您只需为模型提供完整的类定义,或者执行 Simon 对完整类定义所做的操作
        猜你喜欢
        • 2011-03-11
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-25
        相关资源
        最近更新 更多