将变量传递给当前页面布局中的局部变量的最佳方法是什么?

What is the best way to pass a variable to a partial in the layout about the current page?

我已经为一个新的 .Net Core MVC 应用程序实现了一个巨大的模板,并将它分成了不同的部分(页眉、侧边栏、页脚)。

它运行良好 - 但是,侧面菜单栏应该有

<li class="active">

在当前访问的页面上更改为:

<li class="treeview">

<li class="treeview active menu-open">

在任何打开的部分。

除了大量的 if 语句或大量 非常 混乱的代码之外,我不知道该怎么做。有人能给我指出正确的方向吗?

您不需要 if 语句,但您需要使用三元组(即需要一定数量的条件逻辑)。我发现处理这类事情的最简洁的方法是使用如下代码:

@{ string url; /* define anywhere, just needs to be before nav HTML */ } 

...

@{ url = Url.Action("Foo"); }
<li class="@(Request.Path == url ? "active" : null)">
    <a href="@url">Foo</a>
</li>
@{ url = Url.Action("Bar"); }
<li class="@(Request.Path == url ? "active" : null)">
    <a href="@url">Bar</a>
</li>

首先声明 url 变量,因此不需要 50,000 个不同的变量。 URL 被简单地保存到一个变量中,因此您不需要重复任何对 Url.Action 的调用等(即一个用于条件,另一个用于实际 link)。在这里,我只是在进行直接比较匹配,但您可能希望将列表项标记为活动,即使当前页面是子项也是如此。为此,您只需使用 Request.Path.StartsWith(url) 作为条件。但是,不要在 link 上使用它到您的主页(即 /),否则它将始终被标记为活动。

对您的 "treeview" 项采用相同的方法。

@{ url = Url.Action("Item1"); }
<li class="treeview @(Request.Path == url ? "active menu-open" : null)">
    <a href="@url">Tree view item</a>
</li>