یکی از itemهای مهم در بهینه سازی SEO یک وبسایت وجود یک SiteMap استاندارد متشکل از لینکهای موجود در سایت هست که در وبسایتهای داینامیک معمولا این لینکها بر اساس دادههای موجود در بانک اطلاعاتی ایجاد میشه. برای مثال مطالب، اخبار و ....
و اما نحوه استفاده از این کلاسها هم خیلی سادست. به مثال زیر توجه کنید ... فقط این نکته رو در نظر داشته باشید که item هایی که به sitemap اضافه میشه واکشی شده از بانک اطلاعاتی هست، در این مثال چون خواستم ساده توضیح داده بشه نحوه استفاده از این کلاسها، این دادهها به صورت static در نظر گرفته شد ولی شما میتونید دادهها رو بر اساس ساختار بانک اطلاعاتی خودتون واکشی کرده و به SiteMap اضافه کنید تا یک SiteMap کاملا پویا و Dynamic داشته باشید...
در اینجا بنده قبلا یک کلاس برای تولید SiteMap آماده کردم که در پروژههای خودم ازش استفاده میکنم. توسط این کلاس میتونید به صورت داینامیک SiteMap وبسایت مبتنی بر ASP.NET MVC خودتون رو ایجاد کنید.
برای آشنایی با ساختار یک SiteMap استاندارد میتونید به لینک رسمی روبرو مراجعه کنید : http://www.sitemaps.org/de/protocol.html
بنده کلاسهای زیر رو بر مبنای لینک مذکور در سایت رسمی SiteMaps تولید کردم. بعد از تولید SiteMap نیاز دارید که اون رو مثلا به عنوان خروجی یک ActionResult بازگردونید. برای این کار هم یک کلاس با نام XmlResult مشتق شده از ActionResult آماده سازی کردم که کلاس تولید شده SiteMap رو Serialize میکنه و به عنوان نتیجهی یک Action باز میگردونه .
using System; using System.Collections; using System.Web.Mvc; using System.Xml.Serialization; namespace Neoox.Core.SeoTools { [XmlRoot("urlset", Namespace = "http://www.sitemaps.org/schemas/sitemap/0.9")] public class Sitemap { private ArrayList map; public Sitemap() { map = new ArrayList(); } [XmlElement("url")] public Location[] Locations { get { Location[] items = new Location[map.Count]; map.CopyTo(items); return items; } set { if (value == null) return; Location[] items = (Location[])value; map.Clear(); foreach (Location item in items) map.Add(item); } } public int Add(Location item) { return map.Add(item); } } public class Location { public enum eChangeFrequency { always, hourly, daily, weekly, monthly, yearly, never } [XmlElement("loc")] public string Url { get; set; } [XmlElement("changefreq")] public eChangeFrequency? ChangeFrequency { get; set; } public bool ShouldSerializeChangeFrequency() { return ChangeFrequency.HasValue; } [XmlElement("lastmod")] public DateTime? LastModified { get; set; } public bool ShouldSerializeLastModified() { return LastModified.HasValue; } [XmlElement("priority")] public double? Priority { get; set; } public bool ShouldSerializePriority() { return Priority.HasValue; } } public class XmlResult : ActionResult { private object objectToSerialize; public XmlResult(object objectToSerialize) { this.objectToSerialize = objectToSerialize; } public object ObjectToSerialize { get { return this.objectToSerialize; } } public override void ExecuteResult(ControllerContext context) { if (this.objectToSerialize != null) { context.HttpContext.Response.Clear(); var xs = new System.Xml.Serialization.XmlSerializer(this.objectToSerialize.GetType()); context.HttpContext.Response.ContentType = "text/xml"; xs.Serialize(context.HttpContext.Response.Output, this.objectToSerialize); } } } }
public ActionResult Sitemap() { Sitemap sm = new Sitemap(); sm.Add(new Location() { Url = string.Format("http://www.TechnoDesign.ir/Articles/{0}/{1}", 1, "SEO-in-ASP.NET-MVC"), LastModified = DateTime.UtcNow, Priority = 0.5D }); return new XmlResult(sm); }