私は学生で、ASP.NET MVCを初めて使用し、ASP.NET Webフォームを使用しています。 (に慣れている)
私はリストを手に入れました:
<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>
私の目標:どのビューがレンダリングされるかによって、クリックされたに「アクティブ」を追加したいと思います。例:「カテゴリ」をクリックすると、ホームがアクティブなクラスを失い、カテゴリに「アクティブ」が追加されます。 (そして"bg-hover-black"の逆のこと)
実際にレンダリングされたビューをチェックすることでそれを行うことができると思いましたが、それを行う方法がわかりません。 (レンダリングされた実際のビューを確認する方法はわかりませんが、Razorを使用して条件を確認することはできます)
私は最初にJavaScriptで試しました:
$(function () {
$('.sidebar').on('click', 'li', function () {
if (!$(this).hasClass('active')) {
$('.sidebar li').removeClass('active');
$(this).addClass('active');
}
})
})
しかし、ページが読み込まれると、HTMLがホームパーツの「アクティブ」で再レンダリングされるため、機能しません。 (ホームの「アクティブ」を削除すると、クリックとページの読み込みの間を除いて、onClickはアクティブになりません)。
何か解決策はありますか?私はウェブでたくさん検索しましたが、私を助けるものは何も見つかりませんでした。
英語の間違いでごめんなさい、私はまだそれを学んでいます:)。
おかげで、
ヘルキャット8。
あなたはあなたのページがコントローラにちなんで命名される慣習を使っているので、あなたはこれをかみそりで行うことができてコントローラ/ページ名を取得します:
@{
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でこのクライアント側を実行する必要がなくなります。
これが、Razor Pagesプロジェクトの_layout.cshtmlファイルのactive
クラスで装飾された、カスケードされたBootstrapドロップダウンサブメニューの私のアプローチです。
このソリューションの主な要素:
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>
_
確認するには:ユーザーがアイテムをクリックしたときにページを変更しています。
このため、JavaScriptは実行されますが、ページ全体が書き直され、最初の状態に戻ります(つまり、マークアップにあるようにHomeがアクティブになります)。
現在のページを確認するには、location.href
と、次のようなhrefのURLと比較します。
$(function() {
$("ul.sidebar>li").removeClass("active"); // or just not have active in the markup
$("li>a[href=" + location.href + "]").closest("li").addClass("active");
});
または、これがより堅牢になる場合は、viewmodelでトークン(string、enum、またはconst)を渡して、次のように確認できます。
<ul class='sidebar'>
<li data-page='home'...
...
<li data-page='categories'...
その後
$(function() {
$("li[[email protected]]").addClass("active")
(または単にマークアップ内...)
<li data-page='categories' @(Model.PageName == 'Categories' ? "class=active" : "")>
アクティブなアクションまたはコントローラーの名前を取得するには、以下を使用します
var controllerName = ViewContext.RouteData.Values["controller"].ToString();
var actionName = ViewContext.RouteData.Values["action"].ToString();
次のコードを使用して、liのクラスを指定できます。
<li class="@(actionName == "HomePage" ? "active":"")"><a href="~/Account/HomePage">Home</a></li>
または、次のように両方を確認できます。
<li class="@(controllerName =="Account" && actionName == "HomePage" ? "active":"")"><a href="~/Account/HomePage">Home</a></li>