【问题标题】:Correct Razor syntax in helper帮助程序中正确的 Razor 语法
【发布时间】:2017-06-21 12:18:17
【问题描述】:

这应该是相当微不足道的,但事实并非如此。我正在尝试使用 Razor 助手输出一堆链接,但语法似乎天生就很难看。具有良好 Razor 知识的人可以帮助我澄清如何删除 <text> 标签并可能平衡标签,以便我可以摆脱 Raw() 输出?

@helper LinkBuilder(string linkText, string action, string controller, List<string> controllersGroup = null) {
bool userHasAccess = securityEngine.HasAccess(userRoles, controller.ToLower(), Permission.View);

<text></text>   @* Razor demands some output first *@

if (userHasAccess == false) {
    <text><li class="disabled" style="@(listItemWidth)"></text>
}
else {
    <text><li style="@(listItemWidth)"></text>
}

if (userHasAccess) {
    @Html.ActionLink(linkText, action, controller)
}
else {
    <span title="@i18n.NoAccess">@linkText</span>
}

@Html.Raw("</li>") @* Without Html.Raw, Razor complains about unmatching tags *@

}

这个想法是使用这样的代码构建一个菜单:

    <ul>
        @LinkBuilder(i18n.Documents, "Documents", "Product")
        @LinkBuilder(i18n.Reports, "Index", "Report")
        @LinkBuilder(i18n.Committees, "Index", "Committee", new List<string> { "Company", "Person" })
    </ul>

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


    【解决方案1】:

    您可以简化此操作并避免使用条件属性使用&lt;text&gt; 元素

    bool userHasAccess = ...
    <li class=@(userHasAccess ? null : "disabled") style="@(listItemWidth)">
        @if (userHasAccess)
        {
            @Html.ActionLink(linkText, action, controller)
        }
        else
        {
            <span title="@i18n.NoAccess">@linkText</span>
        }
    </li>
    

    【讨论】:

    • 谢谢,这种方法奏效了。但是,究竟为什么 Razor 对辅助函数(开头)中的条件语句的语法如此严格? IE。如果我添加 if (!userHasAccess) listItemClass = "disabled"; 一切正常,但如果我添加括号和 else 语句,它会崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多