[ MVC ] Sitemap, facil e eficiente.

- segunda-feira, 8 de fevereiro de 2010

Hoje desenvolvi lembrei de postar sobre a minha implementação para o sitemap do meu blog, ficou bem legal. Usei objetos disponiveis no blog do Joel Abrahamssom.
Apesar de muito elegante, algumas coisas na solução adotada ainda não me agradavam. Portanto apliquei algumas "melhorias".
Segue o codigo:

namespace RafaelAlmeida.Controllers

{

    public class SitemapController : Controller

    {

        //

        // GET: /Sitemap/

        public XmlSitemapResult Index()

        {

            var itens = new SitemapItensCollection();

            AddEntries(ref itens);

            return new XmlSitemapResult(itens);

        }

 

        private void AddEntries(ref SitemapItensCollection itens)

        {

            var repository = new Models.BlogRepository();

            foreach (var post in repository.getPosts())

            {

                itens.Add(new SitemapItem(@"http://www.rafaelalmeida.net/post/" + post.name) { ChangeFrequency= ChangeFrequency.Weekly, Priority=1, LastModified = post.date});

            }

        }

    }

}

namespace net.rafaelalmeida.XmlSitemap

{

    public class XmlSitemapResult : ActionResult

    {

        private readonly SitemapItensCollection _items;

 

        public XmlSitemapResult(SitemapItensCollection items)

        {

            _items = items;

        }

 

        public override void ExecuteResult(ControllerContext context)

        {

            context.HttpContext.Response.ContentType = "application/rss+xml";

            context.HttpContext.Response.Flush();

 

            var ser = new XmlSerializer(typeof(SitemapItensCollection));

            ser.Serialize(context.HttpContext.Response.Output, _items);

 

        }

    }

}

namespace net.rafaelalmeida.XmlSitemap

{

    [XmlType(Namespace = "http://www.google.com/schemas/sitemap/0.84", TypeName = "urlset")]

    [XmlRootAttribute(Namespace = "http://www.google.com/schemas/sitemap/0.84", ElementName = "urlset", IsNullable = false)]

    public class SitemapItensCollection: List<SitemapItem>

    {

    }

}

namespace net.rafaelalmeida.XmlSitemap

{

    [XmlTypeAttribute(TypeName = "url")]

    public class SitemapItem : ISitemapItem

    {

        public SitemapItem()

        {

        }

 

        public SitemapItem(string url)

        {

            Url = url;

        }

 

        [XmlElementAttribute( DataType = "anyURI", ElementName= "loc")]

        public string Url { get; set; }

 

        [XmlElementAttribute(DataType = "date", ElementName = "lastmod")]

        public DateTime? LastModified { get; set; }

 

        [XmlElementAttribute( ElementName = "changefreq")]

        public ChangeFrequency? ChangeFrequency { get; set; }

 

        [XmlElementAttribute(ElementName = "priority")]

        public float? Priority { get; set; }

    }

}

namespace net.rafaelalmeida.XmlSitemap

{

    public enum ChangeFrequency

    {

        Always,

        Hourly,

        Daily,

        Weekly,

        Monthly,

        Yearly,

        Never

    }

}

namespace net.rafaelalmeida.XmlSitemap

{

    public interface ISitemapItem

    {

        string Url { get; }

 

        DateTime? LastModified { get; }

 

        ChangeFrequency? ChangeFrequency { get; }

 

        float? Priority { get; }

    }

}

Quer ver um exemplo de sitemap gerado ?? http://rafaelalmeida.net/sitemap/index/
Não vou explicar todo o código pois o post já esta grande, porem caso tenha alguma dúvida podem me procurar no twitter, msn, skype. Os dados estão na lateral do site.
OBS: joel abrahamsson, Thx a loot  by your version, and be free to use mine if u like.



Blogado por Rafa Almeida as 18:23
Rafael Almeida Rafael da Silva Almeida, 22 Desenvolvedor;
C#, VB.NET, Java, C, Phyton, Linq, MVC;
VSTS, SQL, TV Digital, Xletview;
eusou@rafaelalmeida.net
SKYPE: stupied4ever
MSN: r.almeidasilva@terra.com.br
Twitter

Ultimos Posts

Amigos