Kategori arşivi: MVC

Asp.net MVC (Model View Controller) – Giriş

Bu yazımda MVC (Model View Controller) teknolojisine giriş yaparak bu teknolojiyi öğrenmeye, kullanmaya başlayacağız. Ayrıca belirtmek isterimki daha önce bu teknolojiyi bilen veya kullanan biri değilim. Ben de yeni yeni öğrenmeye ve kullanmaya çalışıyorum. Takip ettiğim kadarıyla ilgi duyduğum konuları barındıran ve tam istediğim gibi web geliştirme imkanı sağlayan bu teknolojiyi beraber öğrenerek iyi bir noktaya geleceğimizi umut ediyorum. Belirttiğim gibi hem öğreneceğim hem de öğrendiklerimi buradan sizlerle paylaşacağım ve hep beraber bu teknolojiyi kavramaya çalışacağız. Şimdilik kısa bir giriş yapalım ve bu teknolojiyi nasıl kullanmaya başlayacağımıza bakalım.

Öncelikle bu teknolijinin ne olduğuna neden çıktığına ve amacına bakalım. Asp.net MVC (Model View Controller) klasik Asp.net uygulamalarını daha hızlı daha performanslı hale getirmek için geliştirilmiş bir yöntem diyebiliriz. Adında taşıdığı 3 önemli özellik ile bu teknolojiyi tanımlayabiliriz.

İlk özellik olan Model özelliği ile geliştireceğimiz uygulamada kullanacağımız veri yapılarını tanımlayabiliyoruz. Bu veri yapıları veritabanı class’ları, genel class’lar veya kendi ihtiyacımıza göre hazırladığımız yapılar olabilir. Diğer özellik View ise normal bir asp.net sayfası gibi kullanılmakta ve bilgiler, veriler sunulmaktadır. Controller özelliği ise ister Model özelliği ile belirlediğimiz yapıları kullanarak ister hazır yapıları kullanarak View özelliklerine verileri, bilgileri yükler ve View özelliklerinin çalışmasını kontrol eder. Bu özellikleri basitçe bu şekilde ifade edebiliriz.

Asp.net MVC Projesi Oluşturma

Asp.net MVC projesi hazırlamak için bilgisayarımızda Visual Studio 2008 Service Pack 1 yüklü olmalı. Bunun dışında MVC projesi oluşturmak için gereken MVC paketini yüklemeliyiz. (Visual Studio 2008 Service Pack 1’i buradan , MVC paketini ise buradan temin edebilirsiniz.)

Bu paketleri yükledikten sonra MVC projesi oluşturabilir ve çalıştırabiliriz. Bunun için Visual Studio 2008’i açmalı ve sırayla şu sekmeleri kullanmalıyız. File ~ New ~ Project ~ Web (C# veya VB) ~Asp.net MVC Web Application. Bu adımları aşağıda da görebiliriz.

Asp.net MVC (Model View Controller) - Giriş

Bu şekilde projemizi oluşturuyoruz. Projemiz oluştuktan sonra projemiz MVC uygulamasına uygun bir biçimde hazırlanarak geliyor. Bu yapıyı da şe şekilde gibi resmedebiliriz.

Asp.net MVC (Model View Controller) - GirişGörüldüğü gibi MVC projemizde Models, Views ve Controllers klasörleri teknolojinin ana temsilcileri. Models klasörü içinde kullanmak üzere kendi yapılarımızı tanımlıyoruz. Controllers klasörü içinde oluşturacağımız Controller ile Views içinde yer alan View’ları kontrol ediyoruz ve bu view’lara dataları, verileri yükleyebiliyoruz. Views klasörü altında da uygulamamızın sayfaları diyebileceğimiz elemanlar yer almakta. Contents klasörü tasarımda kullanılan css dosyasını, Scripts klasörü kullanılacak olan script dosyalarını (Jquery, Microsoft Ajax, MicroSoftMVC Ajax ve Jquery VS Doc script kütüphanlerinin çeşitli versiyonları) barındırmakta. Bizler de hazırlayacağımız uygulamalara göre bu yapıyı istediğimiz şekilde değiştirebilir, istediğimiz değişiklikleri, eklemeleri, çıkarmaları yapabiliriz.

Böylece MVC teknolojisini klasik Asp.net uygulamalarını daha hızlı daha performanslı yapabilmek için hazırlanmış bir teknoloji olarak tanımlayabiliriz. Bence sağladğı kolaylık, hız ve performans sebebiyle tercih edilmesi gereken bir teknoloji. Bu yüzden bu teknolojiyi incelemeye ve üzerinde çalışmaya karar verdim. Bundan sonra bu teknolojiyi nasıl kullanacağımız hakkında yazılarım devam edecek ve örnek uygulamalar hazırlayacağım.

İlk MVC yazım için hazırladığım örneği buradan indirebilirsiniz.

Umarım MVC teknolojisini iyi bir şekilde öğrenir ve bu konuda iyi bir noktaya beraberce geliriz.

Not : Linkini verdiğim uygulamayı çalıştırmak için Visual Studio 2008 SP1 gerektiğinden bilgisayarında bu eklenti olmayanlar örneği çalıştırma da problem yaşayabilir. MVC paketi için gereken dll dosyalarını örnek içinde paylaştığım için MVC paketi bilgisayarında yüklü olmayanlar örneği çalıştırabilir. (İlerde MVC projelerini çalıştırmak için neler gerektiği hakkında daha detaylı yazım olacaktır.)

Asp.net MVC Areas (Tek Proje Kullanarak)

Bu yazımda tek proje kullanarak MVC Areas yapısını oluşturmayı ve kullanmayı göstermeye çalışacağım. Daha önce buradaki yazımda birden fazla proje kullanarak MVC Areas yapısını oluşturmayı ve kullanmayı göstermiştim. Şimdi de tek proje üzerinde Areas yapısını oluşturma ve kullanmayı göreceğiz. Bu yapı ile hazırlayacağımız projeleri bölümlendirip, daha kolay daha organize daha kolay yönetilebilir ve geliştirilebilir bir yapı oluşturmuş oluyoruz. Ayrıca MVC ile gelen standart yapı dışına çıkıp (Views, Controller klasörlerinin olmaması), istediğimiz dizin yapısı ile MVC projeleri oluşturabiliriz. Bu şekilde çok esnek, çok kolay yönetilebilir, açık bir proje oluşturup, geliştirebiliriz. Şimdi bu Areas yapısını tek proje ile nasıl yapacağımıza bakalım. Asp.net MVC Areas (Tek Proje Kullanarak)Öncelikle Visual Studio ile MVC projemizi oluşturuyoruz. Bunun için File ~ New Project sekmesini seçip, çıkan ekranda kullanacağımız dili, Asp.Net MVC 2 Web Application seçeneğini seçip, diğer seçenekleri eksiksiz tamamlayarak projemizi oluşturuyoruz. Projemizi oluşturduktan sonra Areas yapısını hazırlamak için projenin ana dizinine Areas adında bir klasör oluşturuyoruz. Bu klasör altında oluşturacağımız alt sistemleri (Areas) tanımlayacağız. Ben paylaşacağım örnekte Blog ve Forum adında alt sistemler oluşturdum. Yandaki resimden görüleceği gibi oluşturduğum alt sistemlerin içine de ControllersViews klasörleri ile alt sistemlere ulaşılmak istendiğinde Url isteklerini karşılayacak olan tanımlamaları içeren Routes.cs dosyasını (bu dosyanın içeriğini yazımın devamında bulabilirsiniz.) ekliyoruz. Bu yapıyı her alt sistem için hazırlıyoruz. Alt sistemlerde yer alan Controllers klasörü ile alt sistemleri kontrol eden mekanizmalar tanımlanmış oluyor.Views klasörü içine sayfalarımızı (Views’ları – her bölüm için) tanımlıyoruz. Routes.cs dosyası ile de alt sistemlerin hangi URL isteğinde çalışacağını, URL yapısının nasıl olacağını belirliyoruz. Routes.cs ile tanımladığımız yapıların genel sistem ile çalışması için projenin ana dizininde yer alan Global.asax dosyasında yer alan RegisterRoutes metodu içindeAreaRegistration.RegisterAllAreas(); diyerek alt sistemler için Routes.cs dosyalarında tanımladığımız URL yapılarını da tüm proje için tanımlamış oluyoruz. Tüm bunları yaptıktan sonra tek proje ile Areas yapısını oluşturmuş oluyoruz. Bu şekilde bir sistemde birçok alt sistem tanımlayıp, daha sade daha kolay daha düzenli daha esnek bir proje hazırlamış oluruz. Alt sistemlerde yer alan Routes.cs dosyasının içeriği ise şu şekilde olabilir (Hazırladığım örnekteki Blog alt sistemi için tanımlanan Routes.cs dosyasının içeriği).

namespace MvcAreas2.Areas.Blog
{
  public class Routes : AreaRegistration
  {
    public override string AreaName
    {
      get { return "Blog"; }
    }
    public override void RegisterArea(AreaRegistrationContext context)
    {
      context.MapRoute(
          "Blog_default",
          "Blog/{action}/{id}",
          new { controller = "Blog", action = "Anasayfa", id = "" }
      );
    }
  }
}

Tüm bunları yaptıktan sonra MVC içinde yer alan link oluşturma metotlarını kullanırken Areas özelliğini de bildirmemiz gerekiyor. Ayrıca bu yapıyı kullanmak için MVC 2.0 Preview 2 kurulmuş olması gerekir. Her iki durum için gerekli olan bilgilere buradaki yazımdan ulaşabilirsiniz. Bu şekilde tek proje ile MVC Areas özelliğini nasıl kullanacağımızı görmüş oluyoruz. Tek proje ile Areas özelliğini sağlama ve kullanma birden fazla proje kullanarak Areas özellğini oluşturup kullanmaktan daha kolay. Bu yazıyı hazırlamak için kullandığım örnek projeyi buradan indirebilir, inceleyebilirsiniz.

MVC Captcha

Bu yazımda MVC Captcha uygulamamı sizlere tanıtacağım. Asp.net MVC 1.0 ve 2.0 sürümleri ile çalışan bir Captcha uygulaması geliştirdim. Şimdilik MVC ile hazırlanmış bu uygulamayı fırsat bulduğumda tüm Asp.net uygulamalarında kullanılan esnek bir kontrol haline getirmeyi düşünüyorum. Bu uygulamayı hazırlamaya uzun bir süre önce karar vermiş ve başlamıştım ancak yoğunluk nedeniyle üzerinde duramamıştım. Tasarım ve esneklik olarak çok çok iyi olmasa da şimdilik amacına hizmet edebilecek bir uygulama olduğunu düşünüyorum. Zamanla da geliştirip daha esnek daha güzel bir kontrol haline getirmeyi düşünüyorum. Dll olarak paylaştım ve tüm MVC projelerine bu Dll’i ekleyip sorunsuzca kontrolü kullanabilmekteyiz. Şimdi bu uygulamayı nasıl kullanacağımıza bakalım.

Öncelikle bu uygulamayı Dll olarak hazırladım ve kodlarını bir süre paylaşmayı düşünmüyorum. Tam olarak istediğim bir kontrol haline getirdikten sonra proje olarak paylaşmayı düşünüyorum. Uygulamayı kullanmak için hazırladığım Dll kütüphanelerini buradan indirerek projeye eklemeliyiz (MVC 1.0 ve 2.0 sürümleri için farklı Dll’ler mevcut). Dll dosyasını projeye ekledikten sonra Captcha kontrolünü kullanabilmek için yapmamız gerekenleri ise aşağıdaki kod bölümünde görebilirsiniz. (Örnek olarak hazırladığım sayfanın kodlarıdır)

// Html Bölümü - View

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MDCaptcha" %>

<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
      <%= Html.ValidationSummary() %>
      <% Html.BeginForm("MDCaptcha", "Uygulamalar", FormMethod.Post); %>
        <%= Html.TextBox("Ad") %>
        <%= Html.TextBox("SoyAd") %>
        <%= Html.Captcha() %>
        <input type="submit" value="Gönder"> <%= ViewData["sonuc"] %>
      <% Html.EndForm(); %>
</body>
</html>

// Controller Bölümü

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

[AcceptVerbs(HttpVerbs.Post)]
[MDCaptcha.CaptchaKontrol]
public ActionResult MDCaptcha(string Ad, string SoyAd)
{
  if (string.IsNullOrEmpty(Ad)) ModelState.AddModelError("Ad", "Ad Gerekli");
  if (string.IsNullOrEmpty(SoyAd)) ModelState.AddModelError("Soyad", "SoyAd Gerekli");

  if (ModelState.IsValidField("Captcha"))
  {
    // eğer Captcha değeri doğru ise çalışacak kodlar burada tanımlanacak
    if (ModelState.IsValid)
    {
      ViewData["sonuc"] = "İşlem Tamam";
    }
    else
    {
      ViewData["sonuc"] = "Veriler Eksik!";
    }
  }
  return View();
}

Kodlarda görüldüğü gibi ilk olarak; kullanacağımız sayfaya (View, usercontrol, vb.) eklediğimiz Dll’i referans olarak ekliyoruz. Daha sonra kontrolü oluşturan ve Dll içinden gelen MVC metodumuzu (Html.Captcha()) çağırarak kontrolün oluşmasını sağlıyoruz. Bu şekilde kontrolümüz oluşmuş durumda. Kodlama bölümünde ise bu kontrolden girilen değere göre işlemleri yaptıracağız veya iptal edeceğiz. Bunun için de öncelikle kullanıcılardan alınan verileri işleyecek olan Action’a Dll içinden gelen CaptchaKontrol özelliğini veriyoruz. Daha sonra ise Action içinde Captcha değerinin doğru girilme durumunda çalışacak olan kodları belirtiyoruz.

Asp.net MVC Captcha UygulamamBu şekilde hazırladığım Captcha kontrolünü kullanıcılardan veri alınan sayfalarda kullanabiliyoruz. Böylece spam olaylarının ve robot tarzı yazılımsal saldırıların önüne geçebiliriz.

Hazırladığım uygulama ilk aşamada çok esnek ve tasarımsal olarak hoş olmamış olabilir ancak Captcha uygulaması olarak görevini yerine getirmekte. Şu anda kontrolde 4 karakter oluşmakta ve kullanıcıların bu karakterleri doğrulamaları gerekmekte. Zamanla bu değerleri ve tasarımı dinamik olarak oluşturacak bir yapıya getirerek daha esnek bir kontrol yapacağımı düşünüyorum. Umarım kullanacaklar memnun kalır.

Uygulamayı çalışır halde buradan görebilirsiniz.
Gerekli Dll dosyasını da buradan indirebilirsiniz. (MVC 1.0 ve 2.0 sürümleri için farklı Dll’ler mevcut. MVC 1.0 sürümü ile hazırlanan Dll tüm MVC projelerde sorunsuzca çalışmaktadır.)

MVC önbilgiler-1

Bu yazımda uzun süredir değinemedim MVC hakkında birkaç faydalı bilgiyi paylaşacağım. Aslında bloğumda MVC üzerine yazı yazamasam da MVC ile ilgili oldukça önemli çalışmalar yapmaktayım. Bu çalışmalar sonucu edindiğim birçok bilgi var. Bu yazımda bu bilgilerden birkaçına değinmeye çalışacağım. Bunlardan ilki MVC projelerinde Controller bölümünde tanımlı olmayan bir Action’a istek yapıldığında bu istekleri yakalama işlemini nasıl yapacağımızı göstermeye çalışacağım. Diğeri de kod bölümünde html linkler oluştururken oluşturulacak link adreslerinin tanımlanan Route’lara göre nasıl olacağı. Şimdi bu işlemleri nasıl yapacağımıza bakalım.

Öncelikle MVC projelerinde Controller’da tanımlanmayan bir Action’a istek yapıldığında bu istekleri yakalama ve işlem yapmaya göz atalım. Aslında burada hiçbir kontrol yapmazsak sistem hata üretecektir. Ancak hata üretmek yerine kullanıcıya bilgi verme amaçlı ve hataları izleme, kontrol etme amaçlı olarak bu istekleri yakalayabiliriz. Bunun için MVC projelerinde tanımladığımız Controller sınıflarında aşağıdaki gibi bir kod bloğu (method override) yazabiliriz.

    protected override void HandleUnknownAction(string actionName)
    {
      // Tanımlı olmayan bir istek geldiğinde "TanimsizIstek.aspx" sayfası devreye
      // girer ve hata oluşmaz. Ancak isteyenler burada hata loglaması yapalabilir.
      this.View("TanimsizIstek").ExecuteResult(this.ControllerContext);
    }

Diğer bir konu ise MVC projelerinde kodlama yaparken html verileri kod ile üretmek durumunda kalabiliriz. Bu durumlarda üretilecek html verideki metinlerden ziyade adresler (linkler) önemlidir. Bu durumlarda linkleri statik bir şekilde yazmak iyi olmayacaktır. Bunun için MVC içinde tanımlı olan Helper metotlarını kullanmalıyız. Bu metotlar ile linkler tanımlı olan Route’lara (Global.asax içinde tanımlanan Route yapısı veya özel olarak tanımlanan Route yapısı) göre üretilecek sistemde link kırılmaları oluşmayacaktır. Bunun için örnek bir kodlamayı aşağıdaki gibi yapabiliriz.

    public static string Link(string parametre1, int parametre2)
    {
      UrlHelper uh = new UrlHelper(new System.Web.Routing.RequestContext(
        new HttpContextWrapper(HttpContext.Current), new System.Web.Routing.RouteData()));
      string link = uh.Action("Haber", "Site", new { baslik = parametre1, Id = parametre2 });
      string sonuc = string.Format("<a href=\"{0}\">{1}</a>", link, parametre1);
      // sonuç olarak href değeri Routes tanımlamalarına uygun olarak verilir
      // Routes değişikliğinde buradaki değerlerde bir değişikliğe gerek olmadan
      // yeni yapıya uygun adresler elde edilecektir.
      return sonuc;
    }

Buradaki gibi bir kodlama ile Route yapılarında değişiklik yapsak bile üretilen linklerde bir sorun olmayacak ve tanımlı olan Route bilgilerine göre linkler üretilecektir. Böylece link kırılmaları yaşanmayacak ve URL yapıları değişken hale gelebilecek ve tıpkı WordPress sistemlerindeki gibi esnek URL yapıları kullanılabilecektir. Örnek verecek olursak kendi bloğumda son dönemde URL yapısı ile birçok kez oynadım. Kullandığım uzantıları değiştirdim, Route tanımlamaları yaptım.

İlgilenenler için faydalı olacağını düşünüyorum.

İyi çalışmalar.