Saya mencoba menambahkan kelas "aktif" ke navbar bootstrap saya di MVC, tetapi berikut ini tidak menunjukkan kelas aktif ketika ditulis seperti ini:
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home", null, new {@class="active"})</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
Ini mengatasi apa yang tampak seperti kelas yang diformat dengan benar, tetapi tidak berfungsi:
<a class="active" href="/">Home</a>
Dalam dokumentasi Bootstrap itu menyatakan bahwa tag 'a' tidak boleh digunakan di navbar, tetapi di atas adalah bagaimana saya percaya adalah cara yang benar untuk menambahkan kelas ke Html.ActionLink. Apakah ada cara lain (rapi) yang bisa saya lakukan ini?
asp.net
css
asp.net-mvc
twitter-bootstrap
Gillespie
sumber
sumber
active
kelas keli
elemen, bukana
. Lihat contoh pertama di sini: getbootstrap.com/components/#navbarJawaban:
Di Bootstrap
active
kelas perlu diterapkan ke<li>
elemen dan bukan<a>
. Lihat contoh pertama di sini: http://getbootstrap.com/components/#navbarCara Anda menangani gaya UI Anda berdasarkan apa yang aktif atau tidak tidak ada hubungannya dengan
ActionLink
pembantu ASP.NET MVC . Ini adalah solusi yang tepat untuk mengikuti bagaimana kerangka kerja Bootstrap dibangun.Edit:
Karena Anda kemungkinan besar akan menggunakan kembali menu Anda di beberapa halaman, akan lebih baik untuk memiliki cara untuk menerapkan kelas yang dipilih secara otomatis berdasarkan halaman saat ini daripada menyalin menu beberapa kali dan melakukannya secara manual.
Cara termudah adalah dengan hanya menggunakan nilai yang terkandung di dalamnya
ViewContext.RouteData
, yaitu nilaiAction
danController
. Kami dapat mengembangkan apa yang saat ini Anda miliki dengan sesuatu seperti ini:Itu tidak cantik dalam kode, tetapi itu akan menyelesaikan pekerjaan dan memungkinkan Anda untuk mengekstrak menu Anda ke tampilan parsial jika Anda suka. Ada beberapa cara untuk melakukan ini dengan cara yang jauh lebih bersih, tetapi karena Anda baru memulai saya akan membiarkannya begitu saja. Semoga sukses belajar ASP.NET MVC!
Edit terlambat:
Pertanyaan ini tampaknya mendapatkan sedikit lalu lintas jadi saya pikir saya akan memberikan solusi yang lebih elegan menggunakan
HtmlHelper
ekstensi.Sunting 03-24-2015: Harus menulis ulang metode ini untuk memungkinkan beberapa tindakan dan pengendali memicu perilaku yang dipilih, serta menangani ketika metode ini dipanggil dari tampilan parsial aksi anak, pikir saya akan berbagi pembaruan!
Bekerja dengan .NET Core:
Penggunaan sampel:
sumber
Perpanjangan:
Pemakaian:
sumber
role="presentation"
, yang sama sekali tidak sesuai untuk menu navigasi utama ( john.foliot.ca/aria-hidden/#pr ). Daftar yang tidak terurut merupakan wadah yang tepat untuk serangkaian tautan terkait, karena mengelompokkannya bersama secara logis.var str = String.Format("<li role=\"presentation\"{0}>{1}</li>", currentAction.toLower().Equals(action.toLower(), StringComparison.InvariantCulture) && currentController.toLower().Equals(controller.toLower(), StringComparison.InvariantCulture) ? " class=\"active\"" : String.Empty, html.ActionLink(text, action, controller).ToHtmlString() );
Saya mengatur untuk melakukan ini dengan menambahkan parameter view bag di asp.net mvc. Inilah yang telah saya lakukan
Menambahkan
ViewBag.Current = "Scheduler";
parameter seperti di setiap halamanDi halaman tata letak
Ini menyelesaikan masalah saya.
sumber
Mungkin sedikit terlambat. Tapi semoga ini membantu.
Dan penggunaannya sebagai berikut:
Dapatkan referensi dari http://www.codingeverything.com/2014/05/mvcbootstrapactivenavbar.html
sumber
Saya tahu pertanyaan ini sudah lama, tetapi saya hanya ingin menambahkan suara saya di sini. Saya percaya ini adalah ide yang bagus untuk meninggalkan pengetahuan tentang apakah suatu tautan aktif atau tidak ke pengontrol tampilan.
Saya hanya akan menetapkan nilai unik untuk setiap tampilan dalam aksi controller. Misalnya, jika saya ingin membuat tautan beranda aktif, saya akan melakukan sesuatu seperti ini:
Maka dalam pandangan saya, saya akan menulis sesuatu seperti ini:
Saat Anda menavigasi ke halaman yang berbeda, katakan Program, ViewBag.Rumah tidak ada (sebaliknya ViewBag.Program tidak); oleh karena itu, tidak ada yang ditampilkan, bahkan class = "". Saya pikir ini lebih bersih baik untuk perawatan dan kebersihan. Saya cenderung selalu ingin meninggalkan logika sejauh mungkin.
sumber
Mengingat apa yang diposting Damith, saya pikir Anda hanya dapat memenuhi syarat aktif oleh Viewbag.Title (praktik terbaik adalah mengisi ini di halaman konten Anda memungkinkan halaman Anda
_Layout.cshtml
untuk memegang bar tautan Anda). Perhatikan juga bahwa jika Anda menggunakan item sub-menu, itu juga berfungsi dengan baik:sumber
Saya memodifikasi jawaban "tidak cantik" dom dan membuatnya lebih jelek. Terkadang dua pengendali memiliki nama tindakan yang saling bertentangan (yaitu Indeks) jadi saya melakukan ini:
sumber
Anda dapat mencoba ini: Dalam kasus saya saya memuat menu dari basis data berdasarkan akses berbasis peran, Tulis kode pada setiap tampilan Anda yang ingin Anda aktifkan berdasarkan tampilan Anda.
sumber
Solusi ini sederhana untuk Asp.net MCV 5.
Buat kelas statis, misalnya
Utilitarios.cs
.Di dalam Kelas buat metode statis:
sebut seperti ini
sumber
ASP.NET Core & Bootstrap 4
Jawaban terbaru
Saya telah bekerja kembali solusi rapi @crush untuk cara yang kompatibel , ASP.NET Core dan Bootstrap 4 yang diperbarui untuk menyelesaikan masalah ini berdasarkan
IHtmlHelper
metode ekstensi:Pemakaian
sumber
ActiveActionLink()
akan menerapkan kelas aktif ke<li>
:-)ASP.NET Core 3.0 dan TagHelpers yang mudah
Sertakan dalam _ViewImports.cs Anda:
Pemakaian:
sumber
Tambahkan '.ToString' untuk meningkatkan perbandingan pada ASP.NET MVC
-
sumber
@functions { public bool IsActive(string action, string controller) { var actionRoute = ViewContext.RouteData.Values["Action"].ToString(); var controlRoute = ViewContext.RouteData.Values["Controller"].ToString(); return controller.Equals(controlRoute)&& actionRoute.Equals(actionRoute); } }
dan penggunaan:<li class="@(IsActive("Index", "Home")? "active": "")">
Kita juga bisa membuat
UrlHelper
dari RequestContext yang bisa kita dapatkan dari MvcHandler itu sendiri. Karena itu saya percaya pada seseorang yang ingin menyimpan logika ini dalam template Razor dengan cara berikut ini akan sangat membantu:AppCode
.HtmlHelpers.cshtml
Buat pembantu di sana:
Maka kita dapat menggunakan pandangan kita seperti ini:
Semoga bermanfaat bagi seseorang.
sumber
UrlHelper
yang Anda milikiController.Url
. Satu-satunya hal adalah bahwa kami mungkin tidak ingin mengeksekusi pembuatanUrlHelper
untuk setiap panggilan,MenuItem
jadi kami dapat menerapkan tanda centang untuk menyimpannya ke dalam HttpContext Items setelah panggilan pertama ke helper sehingga kami melakukannya hanya sekali per permintaan.dimungkinkan dengan fungsi lambda
lalu penggunaan
sumber
Saya membuat
HtmlHelper
ekstensi yang menambahkanActiveActionLink
metode bagi Anda yang ingin menambahkan kelas "aktif" ke tautan itu sendiri daripada<li>
mengelilingi tautan.Penggunaannya adalah sebagai berikut:
sumber
jawaban oleh @dombenoit berfungsi. Meskipun itu memperkenalkan beberapa kode untuk dipelihara. Lihat sintaks ini:
Perhatikan penggunaan
.SetLinksActiveByControllerAndAction()
metode.Jika Anda bertanya-tanya apa yang membuat sintaks ini mungkin, lihat TwitterBootstrapMVC
sumber
Saya juga sedang mencari solusi dan jQuery cukup membantu. Pertama, Anda harus memberikan id ke
<li>
elemen Anda .Setelah melakukan ini di halaman tata letak Anda, Anda dapat memberi tahu jQuery
<li>
elemen mana yang harus 'dipilih' dalam tampilan Anda.Catatan: Anda harus memiliki
@RenderSection("scripts", required: false)
di halaman tata letak Anda, tepat sebelum</body>
tag untuk menambahkan bagian itu.sumber
Saya ingin mengusulkan solusi ini yang didasarkan pada bagian pertama dari jawaban Dom.
Kami pertama-tama mendefinisikan dua variabel, "action" dan "controller" dan menggunakannya untuk menentukan tautan aktif:
Lalu:
Sekarang terlihat lebih bagus dan tidak perlu solusi yang lebih kompleks.
sumber
jika tidak ditampilkan sama sekali, alasannya adalah Anda perlu dua tanda @:
TETAPI, saya percaya Anda mungkin perlu memiliki kelas aktif pada tag "li" bukan pada tag "a". menurut juga bootstrap docs ( http://getbootstrap.com/components/#navbar-default ):
oleh karena itu kode Anda akan:
sumber
Semoga ini bisa membantu, di bawah ini adalah bagaimana menu Anda dapat:
Dan tambahkan fungsi pembantu MVC di bawah ini di bawah tag html.
Saya merujuk jawaban dari http://questionbox.in/add-active-class-menu-link-html-actionlink-asp-net-mvc/
sumber
Saya menyadari bahwa masalah ini adalah masalah umum bagi sebagian dari kita, jadi saya menerbitkan solusi saya sendiri menggunakan paket nuget. Di bawah ini Anda dapat melihat cara kerjanya. Semoga bermanfaat.
Catatan: Paket nuget ini adalah paket pertama saya. Jadi, jika Anda melihat kesalahan, tolong beri umpan balik. Terima kasih.
Instal Paket atau unduh kode sumber dan tambahkan Proyek Anda
Tambahkan halaman Anda ke enum
Letakkan Filter di atas Controllor atau Action Anda
Dan gunakan di tata letak tajuk Anda seperti ini
Info Lebih Lanjut: https://github.com/betalgo/MvcMenuNavigator
sumber
Saya percaya di sini adalah kode yang lebih bersih dan lebih kecil untuk mendapatkan menu yang dipilih "aktif":
sumber
Saya telah membuat kombinasi jawaban di atas dan membuat solusi saya.
Begitu..
Pertama di blok silet, buat satu variabel string yang akan berisi nilai nama pengontrol dan tindakan yang dipanggil oleh pengguna.
Kemudian gunakan kombinasi kode HTML dan Razor:
Saya pikir, ini bagus karena Anda tidak perlu mengakses "ViewContext.RouteData.Values" setiap kali mendapatkan nama pengontrol dan nama tindakan.
sumber
Solusi saya untuk masalah ini adalah
Cara yang lebih baik mungkin menambahkan metode ekstensi Html untuk mengembalikan jalur saat ini untuk dibandingkan dengan tautan
sumber
Saya melakukan ini:
Membuat pembantu dalam tampilan sebagian menu
Kemudian menggunakannya di jangkar tag seperti ini:
Aplikasi saya tidak memiliki area tetapi juga dapat dimasukkan sebagai variabel lain dalam fungsi helper. Dan saya harus melewati kelas aktif ke jangkar tag dalam pandangan saya. Tetapi
li
bisa juga dikonfigurasi seperti ini.sumber