我的应用程序中有一些菜单项,如下所示:
- 统计学
- 税
- 技能
就像用户单击统计信息时一样,我想使其处于活动状态,这就是我目前的做法,并且工作正常。
_Layout.cshtml:
<div class="Menu @Html.IsSelected(actions: "Index", controllers: "Statistics", class: "active")" ><a href="/Statistics/Index">Stats</a></div>
<div class="Menu @Html.IsSelected(actions: "Index", controllers: "Tax", class: "active")"><a href="/Tax/Index">Tax</a></div>
<div class="Menu @Html.IsSelected(actions: "Index", controllers: "Skills", class: "active")"><a href="/Skills/Index">Skills</a></div>
public static string IsSelected(this HtmlHelper html, string controllers = "", string actions = "", string cssClass = null)
{
ViewContext viewContext = html.ViewContext;
bool isChildAction = viewContext.Controller.ControllerContext.IsChildAction;
if (isChildAction)
viewContext = html.ViewContext.ParentActionViewContext;
RouteValueDictionary routeValues = viewContext.RouteData.Values;
string currentAction = routeValues["action"].ToString();
string currentController = routeValues["controller"].ToString();
if (String.IsNullOrEmpty(actions))
actions = currentAction;
if (String.IsNullOrEmpty(controllers))
controllers = currentController;
//for passing multiple comma seperated Action.
//For Eg:class="@Html.IsSelected(actions: "List,Detail", controllers: "Default")"
string[] acceptedActions = actions.Trim().Split(',').Distinct().Select(t=>t.ToLower().ToString()).ToArray();
string[] acceptedControllers = controllers.Trim().Split(',').Distinct().Select(t=>t.ToLower().ToString()).ToArray();
return acceptedActions.Contains(currentAction.ToLower()) && acceptedControllers.Contains(currentController.ToLower()) ?
cssClass : String.Empty;
}
但是现在我有一个可以从统计和税务页面访问的公共页面:
排
当用户从统计转到此页面时的URL:
http://localhost:1231/Rank/Index?type=stats&Id=21
当用户从统计转到此页面时的URL:
http://localhost:1231/Rank/Index?type=Tax&Id=48
因此,我想在用户从统计页面进入排名页面时激活"统计"菜单,并在用户从"税务"页面进入排名页面时使"税收"菜单项处于活动状态。
你把这种方式弄得太复杂了。试试这个:
@{ string url = null; }
@{ url = Url.Action("Index", "Statistics"); }
<div class="Menu @(url == Request.Url.AbsolutePath ? "active" : null)">
<a href="@url">Stats</a>
</div>
@{ url = Url.Action("Index", "Tax"); }
<div class="Menu @(url == Request.Url.AbsolutePath ? "active" : null)">
<a href="@url">Tax</a>
</div>
@{ url = Url.Action("Index", "Skills"); }
<div class="Menu @(url == Request.Url.AbsolutePath ? "active" : null)">
<a href="@url">Skills</a>
</div>
换句话说,您只需要一个简单的三元来比较链接的 URL 和当前 URL。 使用Request.Url.AbsolutePath
,以便忽略查询字符串。设置url
变量只是防止多次调用Url.Action
,保持干燥。
它很简单,就像一个把戏
- 创建
Active
css
并设置要显示活动状态的任何颜色。 - 选择其中任何一个时,从所有类中删除类,获取单击的项目。 将名为
Active
的类仅添加到该元素。