2009-04-07 17 views
28

में गतिशील साइटमैप मैं एक स्वचालित साइटमैप एक्शन रिसेट बनाने की कोशिश कर रहा हूं जो वैध साइटमैप.एक्सएमएल फ़ाइल आउटपुट करता है। फ़ाइल की वास्तविक पीढ़ी एक समस्या नहीं है, लेकिन मुझे लगता है कि सिस्टम में यूआरएल की सूची को कैसे पॉप्युलेट करना है, यह समझ में नहीं आता है।एएसपी.नेट एमवीसी

public ContentResult Sitemap() 
    { 
     XNamespace xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 
     XElement root = new XElement(xmlns + "urlset"); 

     //some kind of foreach here to get the loc variable for all URLs in the site 
     //for each URL in the collection, add it to the root element as here 

     //root.Add(
     // new XElement("url", 
     //  new XElement("loc", "http://google.com"), 
     //  new XElement("changefreq", "daily"))); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (StreamWriter writer = new StreamWriter(ms, Encoding.UTF8)) 
      { 
       root.Save(writer); 
      } 

      return Content(Encoding.UTF8.GetString(ms.ToArray()), "text/xml", Encoding.UTF8); 
     } 
    } 

उदाहरण के लिए, मैं दो नियंत्रकों है लगता है, और प्रत्येक नियंत्रक दो कार्यों के लिए उनके साथ संबद्ध किया है::

HelpController

  • संपादित
  • यहाँ कोड मैं अब तक किया है

AboutController

  • कंपनी
  • प्रबंधन

मैं यह पता लगाने की कैसे यूआरएल की तरह की एक सूची प्राप्त नहीं कर पा रहे:

+1

हाल ही में, @ eduncan911 से उत्तर की तरह, सबसे अच्छा समाधान http://mvcsitemap.codeplex.com/ सक्रिय और अद्यतन प्रोजेक्ट का उपयोग करना है, सुरक्षा ट्रिमिंग के लिए समर्थन और sitemap.xml उत्पन्न करेगा। यह साइट साइटमैप को स्वचालित रूप से संपीड़ित कर सकता है अगर एजेंट इसके लिए समर्थन करता है और साइटमैप को उप-साइटमैप में विभाजित करता है यदि साइट बहुत बड़ी है क्योंकि sitemap.xml मानक में केवल 50k नोड्स की सीमा है। – CallMeLaNN

+0

धन्यवाद CallMeLaNN। मैंने हाल ही में उन बिंदुओं और अधिक सूची के उत्तर के साथ-साथ उस साइट को सूचीबद्ध करने के लिए उत्तर दिया जो इसे स्थानांतरित कर दिया गया है। – eduncan911

उत्तर

6

मैंने प्रति पसंद की टिप्पणी के बारे में मार्टिन बल्लियाव के दृष्टिकोण पर एक नज़र डाली, लेकिन ऐसा लगता है कि मैं जो करने की कोशिश कर रहा हूं उसके लिए यह बहुत अधिक है।

मैंने एक अस्थायी समाधान को एक साथ हैक किया है। मैं बस यूआरएल उत्पन्न करने के लिए नियंत्रक और कार्रवाई नाम पास कर रहा हूँ।

List<string> urlList = new List<string>(); 
    urlList.Add(GetUrl(new { controller = "Help", action = "Edit" })); 
    urlList.Add(GetUrl(new { controller = "Help", action = "Create" })); 
    urlList.Add(GetUrl(new { controller = "About", action = "Company" })); 
    urlList.Add(GetUrl(new { controller = "About", action = "Management" })); 

जहां getUrl रूप में नीचे है: आदेश यूआरएल उत्पन्न करने के लिए, मैं निम्नलिखित कोड का उपयोग कर रहा

protected string GetUrl(object routeValues) 
    { 
     RouteValueDictionary values = new RouteValueDictionary(routeValues); 
     RequestContext context = new RequestContext(HttpContext, RouteData); 

     string url = RouteTable.Routes.GetVirtualPath(context, values).VirtualPath; 

     return new Uri(Request.Url, url).AbsoluteUri; 
    } 

यह अब के लिए चाल कर रहा है, हालांकि मैं विचार की तरह करते हैं एक्शनफिल्टर को कुछ क्रियाओं पर लागू किया जाता है जो स्वचालित रूप से एक साथ खींचते हैं।

0

आप कुछ इस तरह की कोशिश की है:

http://blog.maartenballiauw.be/post/2008/08/29/Building-an-ASPNET-MVC-sitemap-provider-with-security-trimming.aspx

अपने प्रश्न को फिर से पढ़ने के बाद, मुझे लगता है कि आप कुछ उदाहरण मैं प्रदान की तुलना में थोड़ा अलग चाहते हैं। मुझे लगता है कि आपको गतिशील रूप से साइटमैप बनाने के लिए सभी ज्ञात नियंत्रकों और उनके कार्यों को प्रतिबिंबित करना होगा।

डेटाबेस या साइटमैप फ़ाइल का उपयोग करना आपके स्रोत के रूप में उपयोग करना बहुत आसान होगा।

7

जैसा कि उल्लेख किया गया है, आप अपने मॉडल (नामों) नामस्थान पर प्रतिबिंबित करना चाहते हैं और आईसींट्रोलर को लागू करने वाले सभी वर्गों को प्राप्त करना चाहते हैं। एक बार आपके पास संग्रह हो जाने के बाद, आप यह देखने के लिए प्रतिबिंबित करना चाहते हैं कि सदस्य (विधियां) किस प्रकार कार्यवाही वापस लौटाते हैं।

शायद आप अपनी खुद की विशेषता बना सकते हैं, [साइटमैपएट्रिब्यूट] जो आपको साइटमैप (यानी, इंडेक्स(), लेकिन संपादित नहीं() में अनुक्रमित करने के तरीकों को चुनिंदा रूप से निर्दिष्ट करने देता है। हाँ, मुझे यह समझना पसंद है कि कौन सी विधियां (यूआरएल) लिखी जाती हैं।

यह एक उत्कृष्ट सवाल है क्योंकि मैं बस ऐसा करने की सोच रहा था। +1!

http://msdn.microsoft.com/en-us/library/ms172331.aspx

अच्छा प्रश्न:

// Controller abstract implements IController 
public class HelpController : Controller 
{ 
    public HelpController() 
    { 
    } 

    [Sitemap] 
    public ActionResult Index() 
    { 
    // does get written to the file, cause of [Sitemap] 
    } 

    public ActionResult Create() 
    { 
    // does not get mapped to the file 
    } 

    public ActionResult Edit() 
    { 
    // does not get mapped to the file 
    } 

    [Sitemap] 
    public ActionResult ViewArticle() 
    { 
    // would get indexed. 
    } 
} 

कैसे प्रतिबिंब करने के लिए के लिए, यहाँ एक अच्छा MSDN लेख आपको प्रतिबिंब के लिए पेश किया पाने के लिए है!

+0

क्या आप सामग्री बनाने के लिए प्रतिबिंब का उपयोग करने का एक उदाहरण पोस्ट कर सकते हैं? विशेष रूप से कार्रवाई से यूआरएल कैसे प्राप्त करें? –

+0

धन्यवाद माइक, लेकिन मेरे पास कोई कोड नहीं है। यह सिर्फ एक सुझाव था। नीचे अन्य उदाहरण प्रतीत होता है। – eduncan911

2

तो, नियंत्रकों और कार्यों की हो रही है मुझे लगता है अपेक्षाकृत मामूली हिस्सा बनने के लिए। कठिन हिस्सा उन सभी संभावित पैरामीटर मान प्राप्त करने में सक्षम है जो आप अपने साइटमैप के यूआरएल में दिखाना चाहते हैं। यदि आपके पास {controller}/{action}/{id} जैसे यूआरएल पैटर्न हैं, तो आप प्रतिबिंब के माध्यम से निर्धारित करने में सक्षम नहीं होंगे कि id का अर्थ क्या है, या संभावित मान। सबसे अच्छा आप सिस्टम प्रकार निर्धारित कर सकते हैं।

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

abstract ActionResult SiteMapSnippet(); 

तो फिर तुम एक SiteMapController बना सकते हैं जो समाधान में अन्य नियंत्रकों में से प्रत्येक को कॉल करता है और उन्हें अपने स्निपेट के लिए पूछता है, और फिर उन्हें एक अंतिम दृश्य में एक साथ प्रस्तुत करता है। एक समग्र नियंत्रक का क्रमबद्ध करें, हालांकि यह एक ऐसी अवधारणा नहीं है जिसे अभी तक इस ढांचे में जोड़ा गया है।

13

मैंने नीचे do-it-yourself उत्तर दिया है। लेकिन यहाँ एक पैकेज है कि यह MVC साइटों के लिए बॉक्स से बाहर करता है:

http://mvcsitemap.codeplex.com/ (< - पुराने स्थल है, लेकिन व्यापक प्रलेखन के साथ!)

https://github.com/maartenba/MvcSiteMapProvider/wiki (< -, नई साइट पर चली कुछ प्रलेखन की कमी है, और के रूप में सक्रिय नहीं)

ध्यान दें कि यह चीजों की एक भीड़ करता है: एसईओ /sitemap.xm के लिए प्रतिक्रिया करने Mvc मार्गों में

  • स्वतः रजिस्टरों में ही एल अनुरोध (भले ही /sitemap.xml के लिए कोई भौतिक फ़ाइल न हो)। यह सभी खोज इंजन रोबोटों के साथ पूरी तरह से संगत है, साथ ही 10,000 से अधिक होने पर रोलिंग आदि।
  • के लिए आंशिक विचारों के एक सेट के साथ आता है BreadCrumb नेविगेशन अंतर्निहित! हम इसे काफी व्यापक रूप से उपयोग करते हैं, हालांकि गतिशील डेटा भाग थोड़ा बोझिल है, यह काम करता है।
  • मेनू को नियंत्रित करने के लिए आंशिक दृश्यों के एक सेट के साथ आता है।
  • आपके नियंत्रकों और कार्य विधियों की [प्राधिकृत] सुरक्षा बिट्स का सम्मान करता है।

उपर्युक्त सभी बिंदुओं को एकल mvc.sitemap XML फ़ाइल से नियंत्रित किया जाता है जिसे आप संपादित और कॉन्फ़िगर करते हैं। मैंने उपरोक्त बिंदुओं में से 2 या 3 करने के लिए अब कई परियोजनाओं में इसका उपयोग किया है। यह सभी जगह 1 में कॉन्फ़िगर करने योग्य है, और गतिशील रूप से जेनरेट किया गया है, वास्तव में अच्छा है।

हालांकि मुझे गतिशील डेटा प्रदाताओं को थोड़ा बोझिल बनाने की क्षमता मिलती है (और आप किसी भी प्रकार के आईओसी का उल्लंघन करते हैं), यह काम पूरा हो जाता है और एक बार जब आप अपने कैशिंग को बाईपास करते हैं और अपना इस्तेमाल करते हैं तो अच्छी तरह से स्केल करते हैं।

+8

यह एक एएसपी.NET साइटमैप एक खोज इंजन –

+1

@Hightechrider के लिए साइटमैप.एक्सएमएल फ़ाइल नहीं है, यह आपके पंजीकृत मानचित्रों के लिए साइटमैप.एक्सएमएल बनाता है। सक्षम करना छोटा है। https://github.com/maartenba/MvcSiteMapProvider/wiki/Exporting-the-sitemap-for-search-engine-indexing – tugberk

+1

यह नया है, इसे इंगित करने के लिए धन्यवाद और नया स्थान। –

5

किसी भी कार्रवाई विधि है कि एक वास्तविक पेज है कि आप अपने साइटमैप में सूचीबद्ध करना चाहते है पर डाल करने के लिए एक ActionFilterAttribute इस तरह परिभाषित करें: -

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class MVCUrlAttribute : ActionFilterAttribute 
{ 
    public string Url { get; private set; } 

    public MVCUrlAttribute(string url) 
    { 
     this.Url = url; 
    } 

    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     // Put this 'canonical url' into the model (which feeds the view) 
     // to help search engines with issues of duplicate content 
     filterContext.Controller.ViewData["CanonicalUrl"] = url; 
     base.OnResultExecuting(filterContext); 
    } 
} 

अब आप अपने वैश्विक आवेदन शुरू कोड के लिए कुछ इस तरह जोड़ सकते हैं या अपने sitemap.xml पैदा कोड में इसका इस्तेमाल करते हैं: -

// Find all the MVC Routes 
    Log.Debug("*** FINDING ALL MVC ROUTES MARKED FOR INCLUSION IN SITEMAP"); 
    var allControllers = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(Controller))); 
    Log.DebugFormat("Found {0} controllers", allControllers.Count()); 

    foreach (var controllerType in allControllers) 
    { 
     var allPublicMethodsOnController = controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance); 
     Log.DebugFormat("Found {0} public methods on {1}", allPublicMethodsOnController.Count(), controllerType.Name); 

     foreach (var publicMethod in allPublicMethodsOnController) 
     { 
      var mvcurlattr = publicMethod.GetCustomAttributes(true).OfType<MVCUrlAttribute>().FirstOrDefault(); 
      if (mvcurlattr != null) 
      { 
       string url = mvcurlattr.Url; 
       Log.Debug("Found " + controllerType.Name + "." + publicMethod.Name + " <-- " + url); 
       Global.SiteMapUrls.Add(url); //<-- your code here using url 
      } 
     } 
    } 

आप विशेषता वर्ग का विस्तार कर सकते शायद भी अद्यतन संकेत की आवृत्ति शामिल करने के लिए।

+0

हाय। क्या यह साइटमैप Google के दिशानिर्देशों के अनुसार मान्य है? –

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