asp.net-mvc – 以编程方式隐藏全局菜单项的Razor代码?

我是一名经验丰富的.NET程序员,但我是这个整个网络编程的新手.我的ASP.NET MVC网站有一个全局布局,其中包含一些内容(页面顶部的菜单链接),我想在控制器代码动态检测到的条件下隐藏这些内容.

我的倾向 – 使用我迄今为止学到的工具的简单方法 – 将布尔的HideGlobal值推入ViewBag,并将全局标记放在_Layout.cshtml中,我想隐藏在@ if(ViewBag.HideGlobal){}阻止.

我只是想知道这是否是“正确”的方式,或者是否有一些我应该使用的Razor魔法,原因对我来说还不明显?

解决方法

我不喜欢在动作返回的视图之外使用动作的视图模型.在这种情况下使用基本视图模型非常笨重.

我相信使用一个单独的(子)动作更清晰,更明显,该动作包含指定全局菜单应如何显示的逻辑.此操作返回全局菜单视图.从布局页面调用该操作.

或者,您可以为确定菜单状态的整个标题创建操作 – 或者执行if / else以呈现全局菜单的部分视图.

下面的示例封装了标题/全局菜单的需求,并提供了一种更改标题/菜单的未来验证方法,对代码基础结构(基本视图模型)的影响最小.

〜/控制器/ LayoutController.cs

public class LayoutController : Controller
{
    [ChildActionOnly]
    public ActionResult Header()
    {
        var model = new HeaderViewModel();
        model.ShowGlobalMenu = ShowGobalMenu();

        return View(model);
    }
}

〜/查看/布局/ Header.cshtml

@model HeaderViewModel
@{
    Layout = "";
}

<header>
    <a href="/">Home</a>

    @if(Model.ShowGlobalMenu)
    {
        <ul>
            <li><a href="#">Link</a></li>
            <li><a href="#">Link</a></li>
            <li><a href="#">Link</a></li>
            <li><a href="#">Link</a></li>
        </ul>
    }
</header>

〜/查看/共享/ _Layout.cshtml

<html>
    <body>
        @Html.Action("Header","Layout")

        <p>Stuff</p>
    </body>
</body>

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...