Bootstrap olarak active
sınıf için uygulanması gereken <li>
eleman değil <a>
. Buradaki ilk örneğe bakın: http://getbootstrap.com/components/#navbar
Neyin etkin olup olmadığına dayalı olarak kullanıcı arabirimi stilinizi işleme şeklinizin ASP.NET MVC'nin ActionLink
yardımcısıyla hiçbir ilgisi yoktur . Bootstrap çerçevesinin nasıl oluşturulduğunu izlemek için uygun çözüm budur.
<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>
Düzenle:
Menünüzü büyük olasılıkla birden çok sayfada yeniden kullanacağınız için, menüyü birden çok kez kopyalayıp manuel olarak yapmak yerine, seçilen sınıfı geçerli sayfaya göre otomatik olarak uygulamanın bir yolunu bulmak akıllıca olacaktır.
En kolay yol, içerdiği değerleri ViewContext.RouteData
, yani Action
ve Controller
değerlerini kullanmaktır. Şu anda sahip olduğunuz şeyin üzerine şunun gibi bir şey inşa edebiliriz:
<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>
Kod olarak güzel değil, ancak işi halledecek ve isterseniz menünüzü kısmi bir görünüme çıkarmanıza izin verecek. Bunu çok daha temiz bir şekilde yapmanın yolları var, ama siz daha yeni başladığınız için, bunu burada bırakacağım. ASP.NET MVC öğrenirken bol şans!
Geç düzenleme:
Bu soru biraz trafik alıyor gibi görünüyor, bu yüzden bir HtmlHelper
uzantı kullanarak daha zarif bir çözüm sunacağımı düşündüm .
Düzenleme 03-24-2015: Birden fazla eylem ve denetleyicinin seçilen davranışı tetiklemesine izin vermek için bu yöntemi yeniden yazmak zorunda kaldım ve yöntemin bir çocuk eylemi kısmi görünümünden ne zaman çağrıldığını ele almalıyım, güncellemeyi paylaşacağımı düşündüm!
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 ile çalışır:
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;
}
Örnek kullanım:
<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>