C# 基于url和查询字符串使菜单项处于活动状态
我的应用程序中有一些菜单项,如下所示:C# 基于url和查询字符串使菜单项处于活动状态,c#,asp.net,asp.net-mvc,html-helper,C#,Asp.net,Asp.net Mvc,Html Helper,我的应用程序中有一些菜单项,如下所示: 统计数字 税 技巧 现在,当用户单击任何菜单项时,我想使其处于活动状态,就像当用户单击统计信息时,我想使其处于活动状态,这就是我当前的操作方式,它工作正常 \u Layout.cshtml: <div class="Menu @Html.IsSelected(actions: "Index", controllers: "Statistics", class: "active")" ><a href="/Statistics/Index"
<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
http://localhost:1231/Rank/Index?type=Tax&Id=48
所以我想在用户从统计页面进入排名页面时激活统计菜单,并在用户从税务页面进入排名页面时激活税务菜单项。这很简单,就像一个技巧
css
的Active
,并设置要显示为Active的任何颜色Active
的类添加到该元素你把这条路弄得太复杂了。请尝试以下方法:
@{ 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>
@{string url=null;}
@{url=url.Action(“索引”、“统计”);}
@{url=url.Action(“Index”,“Tax”);}
@{url=url.Action(“索引”,“技能”);}
换句话说,您所需要的只是一个简单的三元组来比较链接的URL和当前URL<使用code>Request.Url.AbsolutePath,以便忽略查询字符串。设置
url
变量可以避免多次调用url.Action
,保持干燥。我调用了active和everything,我选择的方法工作正常,但唯一的问题是在访问排名页面时使统计和税务菜单项处于活动状态,但当我从统计页面访问排名页面时,我将如何使统计菜单项处于活动状态,这是一个非常糟糕的处理指示用户来自何处的方法。最好在URL本身中指明,即/stats/rank
,tax/rank
,等等。但是,您可以在三元结构中添加一个条件:URL==Request.URL.AbsolutePath | Request[“type”]==“stats”
。@学习:看起来您在这里得到了一个可靠的答案。你会考虑接受吗?要接受对您有效的答案,请单击答案左侧的勾选/勾选图标。不清楚您真正想用该扩展方法做什么,至少它应该返回您想要的整个html(即
和
元素,您可以将其用作(比如)@html.MyLinkFor(“Stats”),“Index”,“Statistics”)
。此时,通过在扩展方法中包括actionName
和controllerName
的参数,然后再在手动
标记中包含参数来重复代码。为什么要给多个
元素一个class=“active”"
?@StephenMuecke:扩展方法为每个菜单项返回活动类。现在发生的是假设您在统计页面上,那么在这种情况下,扩展方法将返回活动类,在税务和技能的情况下,它将返回空字符串。您是指为每个菜单项返回活动类吗?您是说代码添加了class-“主动”
到所有3个
元素?@StephenMuecke:不,不是所有3个菜单项,因为当我在统计页面上时,在扩展方法中,我将从路由字典中获取当前控制器和操作方法名称,这将匹配我传递给此扩展方法的统计信息和索引操作名称。因此l仅将活动类应用于用户单击的菜单项