ASP.NET MVC’de Özel ActionResult Oluşturmak
Bildiğimiz gibi ActionResult; ASP.NET MVC‘de, gelen isteklere yanıt olarak dönmeyi sağlayan sınıflardır. MVC 2′de ActionResult sınıfından türemiş dokuz dahili ActionResult tipi bulunuyordu. Listesine buradan göz atabilirsiniz. MVC 3′de bu tiplere üç yeni tip daha eklendi. Biz de bugün RSS formatında yanıt dönen özel bir ActionResult tipi oluşturacağız.
Önce RSS içeriğini taşıyacak minik bir sınıf oluşturalım
public class RssIcerik
{
public string Baslik {get; set;}
public string Aciklama {get; set;}
public string Link {get; set;}
}
Şimdi de RssResult sınıfımızı oluşturacağız. Burada RSS XML’imizi oluştururken, System.Xml namespace’inde yer alan XmlWriter sınıfından faydalanacağız.
public class RssResult : ActionResult
{
private List<RssIcerik> _rssIcerikleri;
private string _baslik;
private string _aciklama;
private string _link;
public RssResult(IEnumerable icerikler, string baslik, string aciklama, string link)
{
_rssIcerikleri = new List(icerikler);
_baslik = title;
_aciklama = description;
_link = link;
}
//override ettiğimiz bu metod ActionResult tiplerinde yanıt işleme sürecinde çalışır.
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.ContentType = "text/xml";
using (XmlWriter _xmlWriter = XmlWriter.Create(context.HttpContext.Response.OutputStream))
{
// Rss xml'ini oluşturmaya başlıyoruz.
_xmlWriter.WriteStartElement("rss");
_xmlWriter.WriteAttributeString("version", "2.0");
_xmlWriter.WriteStartElement("channel");
// Rss için temel bilgileri giriyoruz.
_xmlWriter.WriteElementString("title", _baslik);
_xmlWriter.WriteElementString("description", _aciklama);
_xmlWriter.WriteElementString("link", _link);
// Rss içeriklerini yazıyoruz
_rssIcerikleri.ForEach(x =>
{
_xmlWriter.WriteStartElement("item");
_xmlWriter.WriteElementString("title", x.Baslik);
_xmlWriter.WriteElementString("description", x.Aciklama);
_xmlWriter.WriteElementString("link", x.Link);
_xmlWriter.WriteEndElement();
});
// Ve xml için kapanış işlemlerini yapıyoruz (rss ve channel tagleri için)
_xmlWriter.WriteEndElement();
_xmlWriter.WriteEndElement();
}
}
}
Son olarak; oluşturduğumuz bu ActionResult tipini ASP.NET MVC projemizde artık bir isteğe yanıt olarak kullanabiliriz. Örnek olarak IEnumerable türünden haber Rss içeriklerini değer olarak dönen RssGetir isimli bir metodumuz olduğunda kullanımı şöyle olabilir:
public ActionResult RssKaynagi()
{
IEnumerable haberler = HaberServisi.RssGetir();
return RssResult (haberler, "Haberler" , "cebirci.com Haber Rss Kaynağı" , "http://feeds.feedburner.com/cebirci");
}