2017-08-03 115 views
1

我是ASP.NET Core中的新成员。我有一个导航菜单,我想跟踪活动项目。 我的想法是用行动和控制器的名称作为导航键:ASP.NET Core:跟踪当前活动页面,或如何在视图中获取控制器和操作名称

enter image description here

问题是我不知道如何在_Layout.cshtml视图获取的动作和控制器的名称...

我已经试过ViewContext.ActionDescriptor.DisplayName但它呈现这样的事情MyApp.Controllers.RecordsController.Index (MyApp)

我宁愿更喜欢得到这样的事情:

<script>$("li#@(Controller.Name)[email protected](Action.Name)")).addClass("active");</script> 

回答

4

使用

var controller = ViewContext.RouteData.Values["Controller"]; 
var action = ViewContext.RouteData.Values["Action"]; 

<script> 
$("li#@(ViewContext.RouteData.Values["Controller"])[email protected](ViewContext.RouteData.Values["Action"])")).addClass("active"); 
</script> 

PS:如果需要

ViewContext.RouteData.Values["Action"].ToString().ToLower(); 

您也可以通过风格的块激活菜单 使用ToLower将()

<style> 
li#@(ViewContext.RouteData.Values["Controller"])[email protected](ViewContext.RouteData.Values["Action"]) { 
//add some style 
} 
</style> 
1

你可以做到这一点服务器端,如果你结合this answer与foll亏欠的。

某处在您的视图中。

@{ 
    var rv = ViewContext.RouteData.Values; 
    var id = $"{rv["Controller"]}-{rv["Action"]}".ToLowerInvariant(); 
} 

对每个<li>

<li class-conditional-active="@(id == "records-index")">...</li> 
+0

有没有这样的事情ControllerName和ActionName ......在ActionDescriptor ...我会用它 – Serge

+0

你说得对。我正在VSCode中检查,显示的是属性,但没有公开。 @ itikhomi的回答是正确的。我仍然会质疑使用JavaScript来做到这一点。 – benembery

+0

@benembery,在脚本/样式块中设置活动菜单样式比在服务器代码中切换多个要好。你可以在没有\ switch的情况下在后端执行吗? – itikhomi

0

有了点网的核心2.0,你可以使用这样

var rv = ViewContext.RouteData.Values; 
string page = $"{rv["page"]}".ToLowerInvariant(); 

在标签页剃刀

<li class="@(page == "/index" ? "active" : "")"><a asp-page="/Index" >Home</a></li> 
相关问题