Kasım 2009 Tarihindeki Makaleler


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 :

Custom Result Solution

Ö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.

Anahtar Kelimeler ASP.NET MVC ActionResult ExecuteResult ImageResult
Dosyalar Custom ActionResult.rar

Fenerbahçe - Steau Bükreş Maçındaydım

Dün akşam 3-1 kazandığımız Fenerbahçe - Steau Bükreş maçındaydım. 4 arkadaş beraber izleyince tabi tadına doyum olmadı. Temponun çok düştüğü dakikalarda sıkılmış olsak da özellikle ikinci yarının ilk 20 dakikasında son derece eğlenceli ve hırslı bir maç oldu. Santos'un ve kaptan Alex'in golleri öyle ustacaydı ki mest olduk. Bir de Alex'in ayağı takılmasa güzel de bir 4. gol gelecekti. Sağlık olsun. Tüm takıma bize bu geceyi yaşattıkları için candan teşekkürlerimi sunuyorum.

Kadıköy StarbucksMaç sonrası

Anahtar Kelimeler Fenerbahçe Steau Bükreş
Dosyalar

IIS Olmadan WCF Host Etme

WCF servislerini IIS olmadan host etmenin bir yoluna ihtiyacınız hiç oldu mu? Eğer olduysa bunu başarmanın kolay bir yolu var: ServiceHost sınıfı. ServiceHost herhangi bir uygulama içerisinde (konsol, winforms vs.) bir servisi başlatıp bitirmemizi ve yaşam süreci boyunca kullanmamızı sağlar. Bu sınıfı test etmek amacıyla biri servisi host edecek öteki de kullanacak olan iki konsol uygulaması kullanacağız.

Not: Her iki uygulamada da WCF sınıflarını kullanabilmek için System.ServiceModel kütüphanesini referans eklemek gerektiğini unutmayınız.

Wcf_Host isimli uygulama adından da anlaşılacağı gibi servisimizi host eden uygulamadır. Uygulamada servisin imzasını belirten IMatServis ServiceContract’ı ve servisi tanımlayan MatematikServis sınıfları vardır. Servisin endpoint bilgileri ise App.config dosyası içerisine yazılmıştır.

IMatServis.cs :

using System;
using System.ServiceModel;

namespace Wcf_Host
{
    [ServiceContract]
    interface IMatServis
    {
        [OperationContract]
        double Topla(params double[] sayilar);
    }
}

MatematikServis.cs :

using System;
using System.Linq;

namespace Wcf_Host
{
    class MatematikServis : IMatServis
    {
        public double Topla(params double[] sayilar)
        {
            return sayilar.Sum();
        }
    }
}

App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Wcf_Host.MatematikServis">
        <endpoint address="http://localhost:1020/MatematikServis" 
                  binding="basicHttpBinding" contract="Wcf_Host.IMatServis" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Şimdi sırada servisin host edilmesi var. Host işlemi için kullanacağımız ServiceHost sınıfı bizden çalıştıracağı servisin türünü parametre olarak bekler. Bu parametreyi verdikten sonra istenirse servisin kullanacağı binding tipi ve endpointler programatik olarak tanımlanabilir. Ancak biz zaten projemizde bu bilgileri App.config dosyası içerisinde verdiğimizden tekrar belirtmemize gerek bulunmamaktadır.

Artık servisi yayına başlatmak için tek yapmamız gereken ServiceHost nesnesinin Open() metodunu kullanarak servisi yayına açmaktır. Open metodu çağırıldıktan sonra uygulama Main metodu içerisinde kendisini çalıştırmaya devam eder ve Close metoduna gelerek kendini hemen kapatır. Servisin bir tuşa basılana kadar açık kalmasını sağlamak için de basitçe bir Console.ReadLine metodu koyarak host uygulamasının beklemesini sağladık.

Program.cs :

using System;
using System.ServiceModel;

namespace Wcf_Host
{
    class Program
    {
        static void Main(string[] args)
        {
            //MatematikServis türünden bir servisi host edeceğini bildirme
            ServiceHost host = new ServiceHost(typeof(MatematikServis));

            host.Open(); //servis yayınını başlatma
            Console.WriteLine("Servis Yayına Açıldı...");

            Console.ReadLine(); //yayının açık kalmasını sağlama
            host.Close(); //yayını kapatma
            Console.WriteLine("Servis Yayını Kapatıldı...");
        }
    }
}

Şimdi servisimizi test etmek için bir client uygulaması hazırlayalım. Bu uygulamada yine Contractımız bulunacak, servis proxyi ise bir MatematikServisClient isminde bir sınıf belirtecektir. Bu sınıfın tanımlaması aşağıdaki gibidir.

MatematikServisClient.cs :

using System;
using System.ServiceModel;

namespace MatematikIslemler
{
    class MatematikServisClient : ClientBase, IMatServis
    {
        public double Topla(params double[] sayilar)
        {
            return Channel.Topla(sayilar);
        }
    }
}

Client uygulamamızdaki bu proxy’nin hangi adrese hangi binding türüyle bağlanacağını ise yine bu uygulamadaki App.Config içerisine aşağıdaki gibi yazıyoruz.

App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:1020/MatematikServis"
                  binding="basicHttpBinding" contract="MatematikIslemler.IMatServis" />
    </client>
  </system.serviceModel>
</configuration>

Son olarak da bu proxyi kullanarak servis çağrımızı yapıyoruz. Unutmayın ki client uygulamasının çalışması için mutlaka host uygulama da açık olmalıdır. Windows Vista ve 7 altında UAC açık olduğunda host uygulamasının düzgün çalışabilmesi için Run as Administrator diyerek uygulumayı yönetici olarak çalıştırmanız gerekmektedir.

Program.cs :

using System;

namespace MatematikIslemler
{
    class Program
    {
        static void Main(string[] args)
        {
            MatematikServisClient cl = new MatematikServisClient();
            double sonuc = cl.Topla(10, 20, -100, 45);
            Console.WriteLine(sonuc);
        }
    }
}

Host uygulaması açıldıktan sonra client çalıştırıldığında elde edeceğimiz ekran çıktıları aşağıdaki gibi olacaktır.

Wcf Host Uygulaması

Wcf Client Uygulaması

Yüce ÇELİKEL
MCPD Enterprise Developer 

Anahtar Kelimeler WCF ServiceHost Binding Contract Endpoint Proxy
Dosyalar

ASP.NET MVC'de JsonResult ve JQuery Yardımıyla AJAX

Bu makalemde sizlere ASP.NET MVC  kullanarak Jquery yardımıyla nasıl AJAX işlemi yapılabileceğinden bahsedeceğim.  İhtiyacımız olacak olan elementler ise jquery script dosyası ve ASP.NET MVC projesi olacaktır.

Bilindiği üzere AJAX denilen kavram javascript kullanılarak tarayıcı arkaplanında server üzerine bir istek yapmak ve istekten dönen sonucu DOM üzerine yansıtmaktır. Tarayıcı üzerinde yazdığımız javascript kodlarını kısaltmak ve işimizi kolaylaştırmak amacıyla JQuery kütüphanesi geliştirilmiştir. Bizim inceleyeceğimiz nokta ise Jquery’e ASP.NET MVC kullanarak nasıl veri sağlanacağıdır. AJAX işlemlerinde veri transferi için XML veya daha ufak boyutlara sahip ve javascript ile entegrasyonu kolay olan JSON kullanılır. Makalemizde transfer amacıyla JSON kullanılacaktır.

ASP.NET MVC mimarisinde controllerlar client’a gönderilecek olan cevap türünü yönetmekle sorumludurlar. Ancak geriye sadece sayfa çıktıları olarak HTML gönderilebildiğini düşünüyorsanız yanılıyorsunuz. Geri dönüş bilgiler bir string, resim, dosya veya örneğimizde kullanacağımız JSON olabilir. Bütün bu türler için MVC Framework içerisinde ActionResult sınıfından türemiş bazı sınıflar bulunmaktadır ve bu türler cevap gönderme işlemleriyle sorumludurlar. Client’a JSON verisi gönderebilmek için hazırlayacağımız action metodunun geri dönüş türü JsonResult olmalıdır. Herhangi bir nesnenin JSON karşılığını hazırlamak için de temel Controller sınıfından gelen Json() metodu kullanılmalıdır.

Örneğimizde bir dizi içerisinde saklanan isim listesinde arama yapacak ve koşulu sağlayan isimleri JSON formatına göre dizi olarak yollayacağız. Bu amaçla aşağıdaki Controller ve içerisinde de Listele action’ı yazılmıştır.

HomeController.cs :

using System;
using System.Web.Mvc;

namespace Mvc_Ajax.Controllers
{
    public class HomeController : Controller
    {
        //isim önerilerinin getirileceği isim dizisi
        string[] isimler = { "Yüce", "Çelikel", "Hakkı", "Nefise", "İrfan", "Sercan" };

        public ActionResult Index()
        {
            return View();
        }

        public JsonResult Listele(string isim)
        {
            string[] sonuc = null; //sonuçların yazılacağı dizi

            if (!String.IsNullOrEmpty(isim))//eğer gönderilen değer boş değilse
                sonuc = Array.FindAll(isimler, s => s.Contains(isim));//içerisinde yollanan değer 

geçen tüm 

değerleri bul
            else
                sonuc = isimler;//eğer gönderilen değer boşsa tüm seçenekleri yolla
            
            //diziyi json formatına çevirme ve geri döndürme
            return Json(sonuc);
        }
    }


Listele metodu client tarafından gönderilecek isim türünden bir parametreyi alacak şekilde tasarlanmıştır. Eğer gönderilen isim değeri boş veya null ise dizi içerisinde tüm elemanlar geriye yollanır. Ancak boş değilse dizide gönderilen değeri taşıyan elemanlar bulunur ve bunlardan oluşan bir liste client’a yollanır. En son satırda da görüleceği gibi oluşan string[] dizisi Json metoduna parametre olarak verilir ve çıktı JSON türünde kullanıcıya yollanır.

Arayüzümüzde ise bir textbox ve listbox kullanıyoruz. Textbox içerisindeki değer değiştiğinde AJAX işlemi yapılır ve Listele action’ı  çağırılır. Eğer işlem başarılıysa sonuç alınır ve eval() fonksiyonu kullanılarak bir javascript dizisi haline çevrilir. Daha sonra da bu dizinin her bir elemanı için listbox içerisinde bir seçenek (option) eklenir. Dizi elemanlarının her biri için aynı işlemin yapılmasını bir jquery kolaylığı olan each() fonksiyonu ile sağlıyoruz.

Home.aspx :

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html>
    <head>
        <script type="text/javascript" src="../../Scripts/jquery-1.3.2.js"></script>
        <style type="text/css">
            label
            {
                display:block;    
            }
        </style>
    </head>
    <body>
        <!-- isimleri textbox verisine göre listeleme -->
        <label>İsim :</label> 
        <%= Html.TextBox("Isim") %><br />
        
        <label>Seçenekler :</label>
        <select size="5" id="Secenek" style="width:150px">
        </select>
        
        <script type="text/javascript">
            $(document).ready(function() {
                //Isim textbox'ına klavye tuşuna basıldığında
                $("#Isim").keyup(function() {
                    
                    //ajax işlemi yaparak eşleşen isim listesini al
                    $.ajax({
                        url: "/Home/Listele?isim=" + $(this).val(), //bu adrese id ismindeki parametrenin değeri 

olarak textbox'ın değerini yolla
                        dataType: "json", //geriye json türünde veri dönecek
                        type: "GET", //bu GET türünde bir istek olsun
                        success: function(result) { //işlem başarılı oursa
                            $("#Secenek").html(""); //eski seçenekleri temizle
                            var isimler = eval(result); //json verisini javascript nesneleri haline getir

                            //her bir isim için seçeneklere yeni bir option ekle
                            $.each(isimler, function(count, item) {
                                $("#Secenek").append("<option>" + item + "</option>");
                            })
                        },
                        error: function() { //hata oluşursa ekranda mesaj göster
                            alert("İsim listesi okumada hata oluştu");
                        }
                    })
                });
            });
        </script>
    </body>
</html>

Yukarıdaki kodları çalıştırdığımız zaman aşağıdaki arayüzü ve textbox içerisine yazı yazdığımız zaman da yandaki resimdeki görüntüyü elde ederiz.

JsonResult ile AJAX   JsonResult ile AJAX

Yüce ÇELİKEL
MCPD Enterprise Developer 

Anahtar Kelimeler ASP.NET MVC Framework JSON JsonResult AJAX JQuery
Dosyalar Mvc_Ajax.rar