Custom ActionResult Hazırlama (ImageResult)
ASP.NET MVC teknolojisinin en güzel yanlarından biri de neredeyse her Microsoft teknolojisi gibi genişletilebilir olması. Şimdi genişletme işlemi için belki de en çok kullanacağınız işlem olan kendimize özel ActionResult hazırlama yöntemini göreceğiz.
ActionResult sınıfı bir action metodunun kompleks işlemler yapan bir sonuç gerektirmesi durumunda kullanılır. Bu sınıf bir abstract class olduğu için nesne alınamaz. Zaten içerisinde de tek metot bulunmaktadır : ExecuteResult. Bu metot ActionResult ile yapılan işlemlerin çalıştırılması için kullanılır. Bizim kullandığımız ViewResult, FileResult, RedirectResult, JsonResult gibi tüm resultlar ActionResult sınıfından türerler. Bu durumda biz de kendi resultlarımızı oluşturabiliriz. Tek yapmamız gereken ActionResult sınıfından türeyen ve ExecuteResult metodunu override eden bir sınıf hazırlamak.
Örnek :
Örneğimde site üzerinde belirli bir klasörde bulunan (Content/Images) bir resmin görüntülenmek üzere img etiketine sağlayacak olan bir ImageResult hazırlayacağım. Bu result sınıfını da AlbumController isimli controllerda GetSingleImage isimli bir action içerisinde kullanacağım. Action metodumuz istediği resmin sadece ismini parametre olarak alacaktır. Bu örneğe uyacak şekilde hazırladığım AlbumController ve ImageResult kodları aşağıda verilmiştir.
using System;
using System.Web;
using System.Web.Mvc;
using System.Drawing;
using System.Drawing.Imaging;
namespace CustomActionResult.Controllers
{
public class AlbumController : Controller
{
public ImageResult GetSingleImage(string isim)
{
string url = String.Format("~/Content/Images/{0}", isim);
return new ImageResult() { ImageUrl = url, Format = ImageFormat.Png };
}
}
public class ImageResult : ActionResult
{
public string ImageUrl { get; set; }
public ImageFormat Format { get; set; }
public override void ExecuteResult(ControllerContext context)
{
Image sonuc = GetImage(context);
HttpResponseBase response = context.HttpContext.Response;
//response içeriğini ayarlama. resim türü Format özelliğinden alınmaktadır
response.ContentType = String.Format("image/", Format);
//resmi client'a gönderilecek bilgileri oluşturan Response'a yazma
sonuc.Save(response.OutputStream, Format);
}
protected Image GetImage(ControllerContext context)
{
if (!String.IsNullOrEmpty(ImageUrl)) //resim adresi verilmişse adresten resmi yükle
{
string url = context.HttpContext.Server.MapPath(ImageUrl);
return Image.FromFile(url);
}
else //her iki parametre de geçersizde hata fırlat
{
throw new ArgumentException("Resim adresi veya resim verilmemiş");
}
}
}
}
Resmi Response üzerine yazma şeklimiz klasik ASP.NET’ten alışık olduğumuz bir kullanım. Görüldüğü gibi MVC, ASP.NET mimarisinin üzerine son derece uyumlu olacak bir şekilde tasarlanmıştır.
Bu controllerı kullandığım sayfa kodları ise aşağıdaki gibidir. Görüleceği üzere tek yaptığım img etiketine kaynak olarak Url.Action metodunu kullanarak legendary.jpg isimli dosyayı vermektir.
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html>
<head>
<title>Custom Action Result</title>
</head>
<body>
<h2>Album Resim</h2>
<img src="<%= Url.Action("GetSingleImage", "Album", new { isim = "legendary.jpg" }) %>" />
</body>
</html>
Çıktı olarak ise aşağıdaki görüntüyü elde ederiz. Görüntüde legendary isimli resmin gözükmesi hazırladığımız ImageResult sınıfının başarılı olduğunu göstermektedir.