2012-03-30 8 views
7

से लिंक करना होगा, मैं Maartenba के MvcSiteMapProvider v.3.2.1 स्थापित किया है और मैं एक बहुत ही सरल, स्थिर, दो स्तर मेनू है कि मैं बनाया है । नीचे वैचारिक नक्शा संरचना है।MvcSiteMapProvider - एकाधिक पन्ने मेरी <strong>MVC3</strong> परियोजना में एक मेनू नोड

- Home 
- Member Center 
    - Member Listing [SELECTED] 
    - Event Calendar 
    - Documents 
- Administration 

अब, वहाँ सदस्य लिस्टिंग के तहत कई उप पृष्ठों (जैसे विस्तार, संपादित करें, आदि) कर रहे हैं, लेकिन मैं नहीं इन 3 स्तर मेनू आइटम के रूप में प्रदर्शित करना चाहते हैं (मुख्य रूप से, क्योंकि वे से बंधा रहे हैं एक विशिष्ट सदस्य आईडी)। हालांकि, मैं चाहता हूं कि इन सभी तीसरे स्तर के पृष्ठों को सदस्य सूची मेनू नोड में "बंधे" हों ताकि यह इन पृष्ठों पर चयनित के रूप में दिखाया जा सके।

मेरे पास मेरी Mvc.SiteMap फ़ाइल में निम्न कोड:

<mvcSiteMapNode title="Home" controller="Home" action="Index"> 
    <mvcSiteMapNode title="Member Center" area="Members" controller="Home" action="Index" roles="Approved Member" > 
    <mvcSiteMapNode title="Member Listing" area="Members" controller="Member" action="List" /> 
    <mvcSiteMapNode title="Event Calendar" area="Members" controller="Event" action="List" /> 
    <mvcSiteMapNode title="Documents" area="Members" controller="Document" action="List" /> 
    </mvcSiteMapNode> 
    <mvcSiteMapNode title="Administration" area="Admin" controller="Home" action="Index" roles="Site Administrator" > 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

मेरी _Layout.cshtml फ़ाइल में, मैं निम्नलिखित कोड का उपयोग कर रहा मेनू प्रस्तुत करना करने के लिए:

@Html.MvcSiteMap().Menu(1, true, true, 1, true, true) 

अंत में, मैंने SiteMapNodeModel.cshtml फ़ाइल को संशोधित किया ताकि वह "चयनितमेनूइटम" कक्षा को नोड में जोड़ सके जो उस पृष्ठ से संबंधित है जो उपयोगकर्ता देख रहा है। यहां स्निपिट है जो मेनू नोड प्रस्तुत करता है। जब तक मैं सदस्यों क्षेत्र में आगे नेविगेट

@model SiteMapNodeModel 
    <a href="@Model.Url" class="@(Model.IsCurrentNode ? "selectedMenuItem" : "")">@Model.Title</a> 

प्रदर्शन और मानचित्र के नेविगेशन बस ठीक काम करता है,। उदाहरण के लिए, यदि मैं पिछले Members/Member/List (जो मेनू को सही तरीके से प्रदर्शित करता है) और Members/Member/Detail/1 जैसे पृष्ठ पर, सदस्य केंद्र ("सदस्य सूची", "ईवेंट कैलेंडर" आदि) के अंतर्गत बच्चे नोड्स गायब हो जाते हैं। इसलिए, यहाँ मेरे दो मुद्दों मैं अपने वर्तमान कोड के साथ होती है:

  1. मुझे लगता है कि किसी भी पृष्ठ, "सदस्य केन्द्र" माता पिता मेनू नोड का हिस्सा है निर्दिष्ट करना चाहते हैं, ताकि बच्चे का मेनू नोड्स " सदस्य केंद्र "प्रदर्शित किया जाएगा, भले ही दिए गए पृष्ठ को मेनू संरचना में एक विशिष्ट नोड के रूप में परिभाषित किया गया हो।

  2. मैं निर्दिष्ट करना चाहता हूं (संभावित रूप से दृश्य या नियंत्रक कार्रवाई में) कि एक विशिष्ट पृष्ठ किसी विशिष्ट मेनू नोड से बंधे होना चाहिए। उदाहरण के लिए, जब उपयोगकर्ता Members/Member/Detail/1 पर है, तो मैं बस "सदस्य सूची" बाल नोड को IsCurrentNode के रूप में निर्दिष्ट करना चाहता हूं ताकि SiteMapNodeModel.cshtml फ़ाइल इसे "चयनितमेनूइटम" वर्ग के साथ सही तरीके से सजा दे।

कोई सुझाव?

उत्तर

6

आप साइटमैप एक्सएमएल में तीसरे स्तर के नोड्स जोड़ सकते हैं और मेनू से उन्हें छिपाने के लिए दृश्यता निर्दिष्ट कर सकते हैं। यहाँ ब्रेडक्रंब में केवल यह प्रदर्शित करने के लिए नोड घोषणा है:

<mvcSiteMapNode area="Members" 
       controller="Member" 
       action="Detail" 
       visibility="SiteMapPathHelper,!*" 
       title="Member details" /> 

संपादित करें:

जहाँ तक मुझे पता है, आप IsCurrentNode निर्धारित नहीं कर सकते। लेकिन आप देख सकते हैं कि मेनू नोड वर्तमान में निम्नलिखित कोड (मैं SiteMapNodeModel प्रदर्शन टेम्पलेट में इसका इस्तेमाल करते हैं) के साथ चुना जाता है:

IList<string> classes = new List<string>(); 
if (Model.IsCurrentNode || Model.IsInCurrentPath && !Model.Children.Any()) 
{ 
    classes.Add ("menu-current"); 
} 
+0

मैक्स, आपको बहुत बहुत धन्यवाद! इससे दूसरे स्तर के नोड्स गायब होने का मूल मुद्दा हल हो जाता है। हालांकि, क्या ऐसा होता है कि जब आप ऐसा करते हैं तो क्या दूसरे स्तर के नोड को IsCurrentNode पर सेट करना है? उदाहरण के लिए, मैं सदस्य विवरण पृष्ठ पर चयनित सदस्य सूची नोड को चयनित के रूप में दिखाऊंगा। यदि नहीं, तो यह एक बड़ा सौदा नहीं है ... केवल एक सौंदर्य अनुरोध है। – bigmac

1

मैक्स की जवाब देने के लिए जोड़ा जा रहा है मैं भी SiteMapNodeModel के लिए एक विस्तार विधि बन जाएगा।तदनुसार

public static class SiteMapNodeModelExtender 
{ 
    public static bool IsRealCurrentNode(this SiteMapNodeModel node) 
    { 
    // Logic to determine the "real" current node... 
    // A naive implementation could be: 
    var currentPath = HttpContext.Current.Request.Url.AbsolutePath; 
    return currentPath.StartsWith("Members/Member/") && node.Title.Equals("Member Center") 
    } 
} 

और प्रदर्शन टेम्पलेट बदलने के लिए:: जो आप सभी कस्टम ऐसा करने के लिए आवश्यक तर्क लागू करने के लिए इस्तेमाल कर सकते हैं आपको लगता है कि तकनीक का उपयोग करना चाहते हैं, मैक्स Kiselev के जवाब देने के लिए

/* Also check IsRealCurrentNode, depending on the use case maybe only 
IsRealCurrentNode */ 
@if ((Model.IsCurrentNode || Model.IsRealCurrentNode()) && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper") { 
    <text>@Model.Title</text> 
} else if (Model.IsClickable) { 
    <a href="@Model.Url ">@Model.Title</a> 
} else { 
    <text>@Model.Title</text> 
} 
1

आगे लेकिन

public class AlwaysInvisibleVisibilityProvider : ISiteMapNodeVisibilityProvider 
{ 
    public bool IsVisible(SiteMapNode node, HttpContext context, IDictionary<string, object> sourceMetadata) 
    { 
     return false; 
    } 
} 
:

एक कस्टम दृश्यता प्रदाता निर्धारित करें: अपने नियंत्रक कार्यों पर विशेषताओं का उपयोग करने में सक्षम हो, मैं निम्नलिखित किया

फिर MvcSiteMapNodeAttribute उपवर्ग:

public class InvisibleMvcSiteMapNodeAttribute : MvcSiteMapNodeAttribute 
{ 
    public InvisibleMvcSiteMapNodeAttribute(string key, string parentKey) 
    { 
     Key = key; 
     ParentKey = parentKey; 
     VisibilityProvider = typeof (AlwaysInvisibleVisibilityProvider).AssemblyQualifiedName; 
    } 
} 

और तुम तो अपने नियंत्रक कार्यों पर इसका इस्तेमाल कर सकते हैं:

[HttpGet] 
[InvisibleMvcSiteMapNodeAttribute("ThisNodeKey", "ParentNodeKey")] 
public ViewResult OrderTimeout() 
{ 
    return View("Timeout"); 
} 
संबंधित मुद्दे