2012-02-24 17 views
8

मैंने हाल ही में MvcSiteMapProvider का उपयोग करने का प्रयास कर एक सड़क ब्लॉक मारा है।एकाधिक MvcSiteMaps का उपयोग

मेरे आवेदन में, मेरे पास तीन अलग-अलग क्षेत्र हैं: लैंडिंग, एप्लिकेशन और प्रशासन। मैंने वर्तमान में एमवीसीसाइटमैपप्रोवाइडर को कार्यान्वित किया है और यह आश्चर्यजनक रूप से काम करता है, लेकिन मैं अब क्या करने की कोशिश कर रहा हूं - एचटीएमएल एमवीसीसाइटमैप हेल्पर का उपयोग करें और उस क्षेत्र के आधार पर एक अलग नक्शा प्रदाता निर्दिष्ट करें।

तो, कब मैं हूं:

  • "व्यवस्थापक" क्षेत्र में - मैं "AdminSiteMapProvider" नामक प्रदाता का उपयोग करना चाहता हूं।
  • "एप्लिकेशन" क्षेत्र में - मैं "AppSiteMapProvider" नामक प्रदाता का उपयोग करना चाहता हूं।

मैं निम्नलिखित की कोशिश की है:

साझा -> _AppLayout.cshtml

@Html.Partial("_Menu") 

साझा -> _Menu.cshtml

@{ 
if (HttpContext.Current != null && HttpContext.Current.Handler is System.Web.Mvc.MvcHandler) 
{ 
    var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler; 
    var currentArea = handler.RequestContext.RouteData.Values["area"] ?? string.Empty; 
    if (!string.IsNullOrEmpty(currentArea.ToString())) 
    { 
     <text>@Html.MvcSiteMap("AppSiteMapProvider").Menu()</text> 
    } 
    else if (currentArea.ToString() == "Admin") 
    { 
     <text>@Html.MvcSiteMap("AdminSiteMapProvider").Menu()</text>  
    } 
}  

}

कोई सुझाव ? मैं सिर्फ एक क्षेत्र के लिए _AppLayout.cshtml सामग्री को नए मास्टर में कॉपी/पेस्ट नहीं करना चाहता हूं, बल्कि मैं इसे सही प्रदाता को गतिशील रूप से चुनना चाहता हूं।

+0

कॉल कर सकते हैं आप mvcSiteMapNode के क्षेत्र विशेषता का उपयोग कर की कोशिश की?

+0

जो केवल जेनरेट किए गए लिंक को बदलता है (मैं वर्तमान में प्रशासन क्षेत्र के लिए "क्षेत्र" का उपयोग करता हूं)। मैं वर्तमान में "व्यवस्थापक" क्षेत्र में ब्राउज़ कर रहा हूं, इस पर निर्भर करता हूं कि मैं एक अलग फ़ाइल (admin.sitemap) में सचमुच लिंक का एक पूरी तरह से अलग सेट उत्पन्न करना चाहता हूं। – Kori

उत्तर

8

(प्रत्येक क्षेत्र के लिए एक नया प्रदाता) अपने web.config फ़ाइल में कुछ इस तरह करें:

var currentArea = (string)ViewContext.RouteData.DataTokens["area"]; 
if (string.IsNullOrWhiteSpace(currentArea)) 
{ 
    <text>@Html.MvcSiteMap("AppSiteMapProvider").SiteMapTitle()</text> 
} 
else if (currentArea.ToString() == "Admin") 
{ 
    <text>@Html.MvcSiteMap("AdminSiteMapProvider").SiteMapTitle()</text> 
} 
:

<siteMap defaultProvider="AppSiteMapProvider" enabled="true"> 
    <providers> 
    <clear /> 
    <add name="AppSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" siteMapFile="~/Mvc.Sitemap" securityTrimmingEnabled="true" cacheDuration="5" enableLocalization="true" scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" excludeAssembliesForScan="" attributesToIgnore="visibility" nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider" /> 
    <add name="AdminSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" siteMapFile="~/Areas/Admin/Mvc.Sitemap" securityTrimmingEnabled="true" cacheDuration="5" enableLocalization="true" scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" excludeAssembliesForScan="" attributesToIgnore="visibility" nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider" /> 
    </providers> 
</siteMap> 

अपने सामान्य masterpage (मेनू के लिए एक ही बात) में इस रखो

और फिनली प्रत्येक क्षेत्र के लिए साइटमैप फ़ाइल बनाएं।

यह मेरे लिए काम करता है। आशा करता हूँ की ये काम करेगा।

+1

आह, पूरी तरह से काम करता है। धन्यवाद :) – Kori

2

यही वह है जो मैंने किया (इस प्रश्न के आधार पर)। यह थोड़ा आसान है, उम्मीद है कि यह मदद करता है। मैंने क्षेत्र के बाद या "डिफ़ॉल्ट" के बाद बस अपना साइट मानचित्र प्रदाता नाम दिया। जो v3 और पूर्व के लिए था -

<ul id="menu"> 
@{ 
    // gets a different sitemap for each area (or the default one) 
    var _siteMap = ViewContext.RouteData.DataTokens["area"] 
         as string ?? "Default"; 
    var sm = Html.MvcSiteMap(_siteMap); 
    @sm.Menu(sm.Provider.RootNode, true, true, 2); 
} 
</ul> 
5

Multiple Sitemaps in One Application यह कैसे v4, जो स्वीकार किए जाते हैं जवाब से काफ़ी बदल गया है में किया जाता है बताते हैं।

प्राथमिक अंतर यह है कि अब अनेक Sitemap डि साथ कॉन्फ़िगर किया गया है, और आप ISiteMapCacheKeyGenerator और/या ISiteMapCacheKeyToBuilderSetMapper, जो MvcSiteMapProvider बताओ कि प्रत्येक Sitemap को भेजे HTTP अनुरोध को मैप करने के लिए छोटे वर्ग हैं लागू करने के लिए की जरूरत है।

+1

डी बैटमैन की पवित्र मां, क्या दो साइटमैप फ़ाइलों का उपयोग करने का कोई आसान तरीका नहीं है? – Jack

+1

क्षमा करें रॉबिन, वर्तमान में नहीं है। हालांकि, अब और अधिक कामकाज हैं जैसे "नामित" एचटीएमएल हेल्पर्स का उपयोग उन्नत विज़िबिल्टिया के साथ करना ताकि उन्हें कई मामलों में आवश्यकता न हो। – NightOwl888

+0

धन्यवाद - मैं केवल एक का उपयोग कर समाप्त हुआ। हकीकत यह थी कि अन्य साइटमैप बस "होम, के बारे में, संपर्क, एफएक्यू" था जो सामने का सामना कर रहा है और हर कोई देख सकता है। इसके लिए साइटमैप का कोई कारण नहीं है। – Jack

5

मैं संस्करण 4 का उपयोग कर रहा हूं, जिसके लिए नामित प्रदाता स्पष्ट रूप से काम नहीं करते हैं। prescribed way to have multiple sitemaps in v4 ने मुझे बेजीबस से डर दिया और मैं चाहता था कि मैं उससे ज्यादा काम कर सकूं।

@ नाइटऑवल 888 के सुझाव के अनुसार अपने उत्तर पर टिप्पणी, मैंने v4 में नामित हेल्पर्स विकल्प का उपयोग किया। मेरे पास अभी भी एक mvc.sitemap फ़ाइल है, लेकिन मेरे पास परस्पर अनन्य दृश्यता विकल्प हैं।

चरण 1: इस सेटिंग को वेब में जोड़ें।config

<add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"/> 

चरण 2: अपनी विभिन्न "मेनू" के नाम लेने और उन्हें प्रत्येक नोड पर visibility विशेषता पर लागू होते हैं। मेरे मामले में मेरे पास "नियमित" और "व्यवस्थापक" था। फिर, ये सभी एक ही mvc.sitemap फ़ाइल में हैं।

<mvcSiteMapNode title="Reports" controller="Report" action="List" visibility="Regular,!*"/> 
<mvcSiteMapNode title="Downloads" controller="Download" action="List" visibility="Regular,!*"/> 
<mvcSiteMapNode title="Documents" controller="Document" action="List" visibility="Regular,!*"/> 

<mvcSiteMapNode title="Users" controller="User" action="List" visibility="Admin,!*"/> 
<mvcSiteMapNode title="Projects" controller="Project" action="List" visibility="Admin,!*"/> 
<mvcSiteMapNode title="Misc" clickable="false" visibility="Admin,!*"> 
    <mvcSiteMapNode title="Reports" controller="Report" action="List" visibility="Admin,!*"/> 
    <mvcSiteMapNode title="Downloads" controller="Download" action="List" visibility="Admin,!*"/> 
    <mvcSiteMapNode title="Documents" controller="Document" action="List" visibility="Admin,!*"/> 
</mvcSiteMapNode> 

आप ध्यान दें होगा, कि रिपोर्ट, डाउनलोड और दस्तावेज़ लिंक दोनों नियमित उपयोगकर्ताओं और व्यवस्थापक उपयोगकर्ताओं के लिए उपलब्ध हैं, लेकिन जब से व्यवस्थापक शायद ही कभी इन विकल्पों का उपयोग करता है, मैं उन्हें विविध सबमेनू में डाल करना चाहते थे।

चरण 3: अपने _Layout.cshtml में, तय करें कि आप कौन सा मेनू प्रदर्शित करना चाहते हैं।

@if(User.IsInRole("Admin")) 
{ 
    @Html.MvcSiteMap().Menu("BootstrapMenuHelperModel", false, new { name = "Admin" }) 
} 
else 
{ 
    @Html.MvcSiteMap().Menu("BootstrapMenuHelperModel", false, new { name = "Regular" }) 
} 

मैं इस bootstrap/sitemap tutorial इस्तेमाल किया, अगर आप मुझे लगता है कि नहीं कर रहे हैं तो आप सिर्फ @Html.MvcSiteMap().Menu(new { name = "MENUNAME" })

+2

चीजों को करने का एक अच्छा और आसान तरीका है। मैं यह भी मानता हूं कि डी दृष्टिकोण अधिक है और काफी हद तक हास्यास्पद है। आपके दृष्टिकोण का उपयोग किया और यह मेरे लिए अच्छा काम कर रहा है। – TheEdge

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