Bootstrapでは、active
クラスは<li>
要素ではなく要素に適用する必要があります<a>
。こちらの最初の例をご覧ください:ください http //getbootstrap.com/components/#navbar
アクティブまたはアクティブでないものに基づいてUIスタイルを処理する方法は、ASP.NET MVCのActionLink
ヘルパーとは関係ありません。これは、Bootstrapフレームワークがどのように構築されたかを追跡する適切なソリューションです。
<ul class="nav navbar-nav">
<li class="active">@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
編集:
複数のページでメニューを再利用する可能性が高いので、メニューを何度もコピーして手動で行うのではなく、現在のページに基づいて選択したクラスを自動的に適用する方法が賢明です。
最も簡単な方法は、に含まれる値ViewContext.RouteData
、つまりAction
and Controller
値を使用することです。私たちはあなたが現在持っているものを次のようなもので構築することができます:
<ul class="nav navbar-nav">
<li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Index" ? "active" : "")">@Html.ActionLink("Home", "Index", "Home")</li>
<li class="@(ViewContext.RouteData.Values["Action"].ToString() == "About" ? "active" : "")">@Html.ActionLink("About", "About", "Home")</li>
<li class="@(ViewContext.RouteData.Values["Action"].ToString() == "Contact" ? "active" : "")">@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
これはコードではきれいではありませんが、必要に応じて作業を完了し、メニューを部分ビューに抽出できます。これをもっときれいな方法で行う方法はいくつかありますが、あなたは始めたばかりなのでそれはそのままにしておきます。ASP.NET MVCを学ぶ幸運を祈ります!
遅い編集:
この質問は少しトラフィックが増えているようなので、HtmlHelper
拡張機能を使用してよりエレガントなソリューションを投入すると思いました。
編集03-24-2015:選択した動作をトリガーする複数のアクションとコントローラー、およびメソッドが子アクションの部分ビューから呼び出されたときの処理を可能にするために、このメソッドを書き直さなければなりませんでした。更新を共有したいと思いました!
public static string IsSelected(this HtmlHelper html, string controllers = "", string actions = "", string cssClass = "selected")
{
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;
string[] acceptedActions = actions.Trim().Split(',').Distinct().ToArray();
string[] acceptedControllers = controllers.Trim().Split(',').Distinct().ToArray();
return acceptedActions.Contains(currentAction) && acceptedControllers.Contains(currentController) ?
cssClass : String.Empty;
}
.NET Coreで動作します:
public static string IsSelected(this IHtmlHelper htmlHelper, string controllers, string actions, string cssClass = "selected")
{
string currentAction = htmlHelper.ViewContext.RouteData.Values["action"] as string;
string currentController = htmlHelper.ViewContext.RouteData.Values["controller"] as string;
IEnumerable<string> acceptedActions = (actions ?? currentAction).Split(',');
IEnumerable<string> acceptedControllers = (controllers ?? currentController).Split(',');
return acceptedActions.Contains(currentAction) && acceptedControllers.Contains(currentController) ?
cssClass : String.Empty;
}
使用例:
<ul>
<li class="@Html.IsSelected(actions: "Home", controllers: "Default")">
<a href="@Url.Action("Home", "Default")">Home</a>
</li>
<li class="@Html.IsSelected(actions: "List,Detail", controllers: "Default")">
<a href="@Url.Action("List", "Default")">List</a>
</li>
</ul>