बूटस्ट्रैप में active
वर्ग को <li>
तत्व पर लागू करने की आवश्यकता है, न कि <a>
। पहला उदाहरण यहाँ देखें: http://getbootstrap.com/compenders/#navbar
जिस तरह से आप अपनी UI शैली को सक्रिय करते हैं उसके आधार पर संभालते हैं या ASP.NET MVC के ActionLink
सहायक के साथ कुछ नहीं करते हैं । बूटस्ट्रैप फ्रेमवर्क कैसे बनाया गया था, इसका पालन करने के लिए यह उचित समाधान है।
<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
और 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 कोर के साथ काम करता है:
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>