2012-02-15 12 views
14

मुझे आश्चर्य है कि एएसपी.नेट एमवीसी 3 का उपयोग करते समय आपके नेविगेशन में वर्तमान पृष्ठ पर सीएसएस क्लास को जोड़ना संभव है?एएसपी.नेट एमवीसी - नेविगेशन में हाइलाइटिंग वर्तमान पृष्ठ

<p>@Html.ActionLink("Product Search", "Index", new { controller = "Home" }, new { @class = "current" }) 
       | @Html.ActionLink("Orders", "Index", new { controller = "Orders" }) 
       | @Html.ActionLink("My Account", "MyAccount", new { controller = "Account" }) 
       | @Html.ActionLink("Logout", "LogOff", new { controller = "Account" })</p> 

आप मैं पहली बार एक CSS वर्ग "वर्तमान" यह करने के लिए लागू होने के साथ मेरे नेविगेशन में 4 लिंक देख सकते हैं, मैं होना चाहते हैं: यहाँ मेरी _Layout.cshtml फ़ाइल में मेरे नेविगेशन है मेरे नेविगेशन में अलग-अलग लिंक पर इस वर्ग को जोड़ने/निकालने में सक्षम है, इस पर निर्भर करता है कि उपयोगकर्ता किस पृष्ठ पर है। क्या यह संभव है?

चीयर्स

उत्तर

12

लेता है मैं इस के लिए एक विस्तार विधि का उपयोग कर की सिफारिश करेंगे। कुछ की तरह:

@using MyExtensionNamespace; 

... 

    @Html.NavigationLink("Product Search", "Index", "Home") 
| @Html.NavigationLink("Orders", "Index", "Orders") 
| @Html.NavigationLink("My Account", "MyAccount", "Account") 
| @Html.NavigationLink("Logout", "LogOff", "Account") 

यह अपना रेजर एक छोटे से क्लीनर रखने को लाभ मिलता है और:

public static HtmlString NavigationLink(
    this HtmlHelper html, 
    string linkText, 
    string actionName, 
    string controllerName) 
{ 
    string contextAction = (string)html.ViewContext.RouteData.Values["action"]; 
    string contextController = (string)html.ViewContext.RouteData.Values["controller"]; 

    bool isCurrent = 
     string.Equals(contextAction, actionName, StringComparison.CurrentCultureIgnoreCase) && 
     string.Equals(contextController, controllerName, StringComparison.CurrentCultureIgnoreCase); 

    return html.ActionLink(
     linkText, 
     actionName, 
     controllerName, 
     routeValues: null, 
     htmlAttributes: isCurrent ? new { @class = "current" } : null); 
} 

तो फिर आप अपने विस्तार के नाम स्थान सहित और सिर्फ अपने विधि को फोन करके अपने दृश्य में उपयोग कर सकते हैं अन्य विचारों में आसानी से पुन: प्रयोज्य है।

+0

धन्यवाद, उत्तर के रूप में चिह्नित किया गया है क्योंकि मुझे लगता है कि यह करने का सबसे अच्छा तरीका है, क्लीनर रेजर दृश्य और कोड पुनः उपयोगिता – CallumVass

+0

एक्सटेंशन 'HtmlHelper.ActionLink()' के लिए, [LinkExtensions] (https://msdn.microsoft.com/en-us/library/system.web.mvc.html.linkextensions.aspx) के लिए नामस्थान जोड़ें: 'System.Web.Mvc.Html का उपयोग कर; ' – Mike

24

आप अपने HTML में अपने वर्ग विशेषता में फिर इस

@{ 
    var currentController = ViewContext.RouteData.Values["controller"] as string ?? "Home"; 
    var currentAction = ViewContext.RouteData.Values["action"] as string ?? "Index"; 
    var currentPage = (currentController + "-" + currentAction).ToLower(); 
} 

@Html.ActionLink("Product Search", "Index", "Home", null, 
       new { @class = currentPage == "home-index" ? "current" : "" }) 
@Html.ActionLink("MyAccount", "MyAccount", "Account", null, 
        new { @class = currentPage == "account-myaccount" ? "current" : "" }) 
+0

धन्यवाद! यह – CallumVass

+0

मदद करने के लिए खुशी हुई! आपका दिन शुभ हो! – dknaack

+0

@dknaack क्या आप आखिरी से पहले} नहीं खो रहे हैं? –

8
@{ 
    var controller = ViewContext.RouteData.Values["controller"].ToString(); 
    var action = ViewContext.RouteData.Values["action"].ToString(); 
    var isActiveController = new Func<string, string, string, string, string>((ctrl, act, activeStyle, inactiveStyle) => controller == ctrl && action == act ? activeStyle : inactiveStyle); 
} 

कर सकते हैं आप कर सकते हैं:

class="@isActiveController("controlername","action","activecssstyleclass","inactiveccsstyle")" 

बस एक के अन्य तरीके से @dknaack उसकी उत्तर .. आपके कोड में दोहराने के लिए थोड़ा अधिक सामान्य और कम कार्यक्षमता।

2

मैं इस करवाने के लिए इस ट्यूटोरियल में प्रयोग किया जाता है, यह बहुत आसान है समझने के लिए और 2 मिनट Hightlight Active menu item

+1

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि आपको अपने प्रत्येक नियंत्रक कार्यों में ViewBag.CurrentPage करना है .. – CallumVass

2

मेरे मामले में, मान लें कि मेरे पास होम पेज और मेनू है। फिर अपने li वर्ग के लिए एक शर्त के रूप में यह सक्रिय है या नहीं करने के लिए

@{ 
    ViewBag.Title = "Home"; 
    ViewBag.Active = "Home"; 
} 

यह जगह:

एक ViewBag.Active एक प्लेसहोल्डर के रूप होम पेज में इस तरह जोड़े

<li class="@(ViewBag.Active=="Home"? "active" : "")"> 
     <a href="@Url.Action("Index", "Home")"><span>@ViewBag.Title</span></a> 
</li> 
+0

मुझे वास्तव में यह जवाब पसंद है। बस आसान और बहुत व्यावहारिक। –

+0

यह बूटस्ट्रैप 4 के एनवी सेटअप के साथ बहुत अच्छी तरह से काम करता है, जहां ली में "सक्रिय" सीएसएस वर्ग के साथ-साथ "एनवी-आइटम" – JaneH

संबंधित मुद्दे