帮助器

时间:2017-06-21 12:18:18

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

这应该是相当微不足道的,但事实并非如此。我正在尝试使用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>

1 个答案:

答案 0 :(得分:2)

您可以简化此操作,并避免使用条件属性

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