我是一名学生,对ASP.NET MVC很陌生,我来自ASP.NET Web Form。 (习惯了)
我有一份清单:
<ul class="sidebar bg-grayDark">
<li class="active">
<a href="@Url.Action("Index", "Home")">
<span class="mif-home icon"></span>
<span class="title">Home</span>
</a>
</li>
<li class="bg-hover-black">
<a href="@Url.Action("Index", "Product")">
<span class="mif-shop icon"></span>
<span class="title">Products</span>
<span class="counter">14</span>
</a>
</li>
<li class="bg-hover-black">
<a href="@Url.Action("Index", "Category")">
<span class="mif-flow-cascade icon"></span>
<span class="title">Categories</span>
<span class="counter">9</span>
</a>
</li>
<li class="bg-hover-black">
<a href="@Url.Action("Index", "User")">
<span class="mif-users icon"></span>
<span class="title">Users</span>
<span class="counter">1</span>
</a>
</li>
</ul>
我的目标: 通过哪个视图呈现,我想将“活动”添加到已单击的 。 示例:我单击“类别”,然后Home丢失其活动类,并且类别已将“活动”添加到其类中。 (与“bg-hover-black”相反的事情)
我以为我可以通过检查实际呈现的视图来做到这一点,但我不知道该怎么做。 (我不知道如何检查渲染的实际视图,但使用Razor检查条件是可以的)
我首先尝试使用JavaScript:
$(function () {
$('.sidebar').on('click', 'li', function () {
if (!$(this).hasClass('active')) {
$('.sidebar li').removeClass('active');
$(this).addClass('active');
}
})
})
但它不起作用,因为当页面加载时,html将以“活动”为主页部分重新呈现。 (如果我删除了Home的“active”,那么除了点击和页面加载之外,onClick上什么都不会激活。)
你有解决方案吗?我在网上搜索了很多,但没有找到任何帮助我。
对不起任何英语错误,我还在学习:)。
谢谢,
Hellcat8。
答案 0 :(得分:11)
由于您正在使用以控制器命名页面的约定,您可以在剃刀中执行此操作以获取控制器/页面名称:
@{
var pageName = ViewContext.RouteData.Values["controller"].ToString()
}
<ul class="sidebar bg-grayDark">
<li class="@(pageName == "Home" ? "active" : "")">
<a href="@Url.Action("Index", "Home")">
<span class="mif-home icon"></span>
<span class="title">Home</span>
</a>
</li>
<li class="bg-hover-black @(pageName == "Product" ? "active" : "")">
<a href="@Url.Action("Index", "Product")">
<span class="mif-shop icon"></span>
<span class="title">Products</span>
<span class="counter">14</span>
</a>
</li>
<li class="bg-hover-black @(pageName == "Category" ? "active" : "")">
<a href="@Url.Action("Index", "Category")">
<span class="mif-flow-cascade icon"></span>
<span class="title">Categories</span>
<span class="counter">9</span>
</a>
</li>
<li class="bg-hover-black @(pageName == "User" ? "active" : "")">
<a href="@Url.Action("Index", "User")">
<span class="mif-users icon"></span>
<span class="title">Users</span>
<span class="counter">1</span>
</a>
</li>
</ul>
这将在页面服务器端设置您的活动类,无需使用javascript执行此客户端。
答案 1 :(得分:2)
确认:当用户点击该项目时,您正在更改页面。
因此,您的javascript将会运行,但随后整个页面都会被重新编写,并且您将返回到第一个状态(即主页在标记中处于活动状态)。
要查看当前页面,您可以使用location.href
并将其与href网址进行比较,例如:
$(function() {
$("ul.sidebar>li").removeClass("active"); // or just not have active in the markup
$("li>a[href=" + location.href + "]").closest("li").addClass("active");
});
或者,这会更强大,您可以使用viewmodel传递一个标记(字符串,枚举或const)并检查,例如:
<ul class='sidebar'>
<li data-page='home'...
...
<li data-page='categories'...
然后
$(function() {
$("li[data-page=@Model.PageName]").addClass("active")
(或仅在标记中......)
<li data-page='categories' @(Model.PageName == 'Categories' ? "class=active" : "")>
答案 2 :(得分:2)
这是我的方法,用于级联Bootstrap下拉子菜单,在Razor Pages项目的_layout.cshtml文件中使用active
类进行修饰。
此解决方案的主要元素:
ViewContext.RouteData.Values["page"]
获取当前页面路线。@Url.Action()
。代码:
<ul class="nav navbar-nav">
@{
String pageRoute = ViewContext.RouteData.Values["page"].ToString();
}
<li class="dropdown @( pageRoute.Contains("/CustomerModel/") ? "active" : "" )">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Customer-Model <span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="@( pageRoute.Contains("/Customers/") ? "active" : "" )"><a asp-page="/CustomerModel/Customers/Index">Customers</a></li>
<li class="@( pageRoute.Contains("/Partners/") ? "active" : "" )"><a asp-page="/CustomerModel/CustomerPermissions/Index">CustomerPermissions</a></li>
</ul>
</li>
<li class="dropdown @( pageRoute.Contains("/StaffModel/") ? "active" : "" )">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Staff-Model <span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="@( pageRoute.Contains("/Staff/") ? "active" : "" )"><a asp-page="/StaffModel/Staff/Index">Staff</a></li>
<li class="@( pageRoute.Contains("/StaffGroups/") ? "active" : "" )"><a asp-page="/StaffModel/StaffGroups/Index">StaffGroups</a></li>
<li class="@( pageRoute.Contains("/PermissionsGroups/") ? "active" : "" )"><a asp-page="/StaffModel/PermissionsGroups/Index">PermissionsGroups</a></li>
<li class="@( pageRoute.Contains("/AllowedModules/") ? "active" : "" )"><a asp-page="/StaffModel/AllowedModules/Index">AllowedModules</a></li>
<li class="@( pageRoute.Contains("/AllowedServices/") ? "active" : "" )"><a asp-page="/StaffModel/AllowedServices/Index">AllowedServices</a></li>
</ul>
</li>
</ul>
答案 3 :(得分:0)
要获取活动动作或控制器的名称,请使用以下
combineScore
然后您可以使用以下代码为li授课:
var controllerName = ViewContext.RouteData.Values["controller"].ToString();
var actionName = ViewContext.RouteData.Values["action"].ToString();
或者您可以按以下方式检查它们:
<li class="@(actionName == "HomePage" ? "active":"")"><a href="~/Account/HomePage">Home</a></li>