我不喜欢在动作返回的视图之外使用动作的视图模型。在这种情况下使用基本视图模型感觉非常笨拙。
我相信仅使用包含指定全局菜单应如何显示的逻辑的单独(子)操作会更清晰、更明显。此操作返回全局菜单视图。从您的布局页面调用该操作。
或者,您可以为确定菜单状态的整个标题创建一个操作——或者执行 if/else 以呈现全局菜单的部分视图。
下面的示例封装了标题/全局菜单的需求,并提供了一种面向未来的更改标题/菜单的方法,对代码基础结构(基本视图模型)的影响最小。
~/Controllers/LayoutController.cs
public class LayoutController : Controller
{
[ChildActionOnly]
public ActionResult Header()
{
var model = new HeaderViewModel();
model.ShowGlobalMenu = ShowGobalMenu();
return View(model);
}
}
~/Views/Layout/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>
~/Views/Shared/_Layout.cshtml
<html>
<body>
@Html.Action("Header", "Layout")
<p>Stuff</p>
</body>
</body>