【问题标题】:What is the best way to pass a variable to a partial in the layout about the current page?将变量传递给当前页面布局中的部分的最佳方法是什么?
【发布时间】:2019-01-09 17:47:37
【问题描述】:

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

效果很好 - 但是,侧面菜单栏应该有

<li class="active">

在当前访问的页面上并从:

<li class="treeview">

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

在任何打开的部分。

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

【问题讨论】:

  • 这听起来像是前端 Javascript 的工作(根据前端事件、用户操作等添加/删除属性)。 Hth.

标签: c# layout asp.net-core-mvc asp.net-mvc-partialview


【解决方案1】:

您不需要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 等的任何调用(即一个用于条件链接,另一个用于实际链接)。在这里,我只是进行直接比较匹配,但您可能希望将列表项标记为活动,即使当前页面是子项。为此,您只需使用 Request.Path.StartsWith(url) 作为您的条件。但是,不要在指向您主页的链接上使用它(即/),否则它将始终被标记为活动。

对您的“treeview”项目采用相同的方法。

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

【讨论】:

  • 我正在尝试学习一个前端框架,正如上面的评论,但这很棒 - 谢谢......我喜欢这种方法(我是一个传统的应用程序程序员,涉足网络东西,所以,我觉得这个更舒服!)
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多