MVC etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
MVC etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Pazar, Temmuz 12, 2009

Asp.Net MVC Framework - Master Pages Kullanımı - II

Asp.Net MVC Framework ile bugüne kadar bir çok konuya değinme şansı bulduk ve temel kavramlarını rahatlıkla yapabilir duruma geldik. Görsel olarak uygulamalarımızı daha da kuvvetli duruma getirebilmek için bir önceki MVC Framework yazımızda Master Page 'i nasıl kullanabileceğimize değinmiştik. Peki bu noktada aklımıza bir kaç soru takılıyor. Eğer tasarımsal öğelerini rahatlıkla düzenleyebiliyorsak hazır şablonlar da olmalı ve onlar yardımı ile de düzenleyebiliriz şeklinde sorular gelmektedir. Bunun cevabı ise oldukça basittir. MVC ile geliştirilen uygulamalarda kullanılmak üzere oluşturulan tasarım galerisi sayfası mevcuttur. Buradan erişebilmemiz mümkün olacaktır.

Yazımızın girişinde de anlayacağınız gibi farklı tasarım şablonlarını uygulamalarımızda nasıl kullanabileceğimizi inceleye çalışacağız. Ama ilk olarak bu değişiklikleri uygulayabilmemiz için bir projeye ihtiyacımız vardır. Daha önceki yazılarımızdan yararlanarak hızlıca bir tane oluşturuyoruz.



İlk olarak yapmamız gereken yukarıda görmüş olduğumuz standart MVC Framework tasarımını düzenleyecek görsel şablonu seçmemiz gerekiyor. Bu işlemi gerçekleştirmek için MVC Framework galeri sitesine girmemiz gerekecektir. Sitemize http://www.asp.net/mvc/gallery/ adresinden ulaşabilmemiz mümkündür.



Yukarıda görmüş olduğunuz tasarımların dışında daha onlarca tasarım yer almaktadır. Bu tasarımlardan herhangi birini seçerek web sitemize uygulamayabilmemiz mümkündür. Beğendiğimiz herhangi bir tasarımı beğeniyoruz ve aşağıdaki işlemleri uygulamaya başlıyoruz.

1. Beğenmiş olduğumuz tasarımı bilgisayara indirebilmek için tasarımın hemen altında yer alan Download seçeneğine tıklıyoruz.
2. İndirmiş olduğunuz sıkıştırılmış dosyanın üzerinde sağ tıklama sonrası özelliklerine giriyoruz ve Unblock seçeneğine tıklıyoruz.



3. Tasarımı sıkıştırılmış dosyanın içerisinden çıkartıyoruz.
4. Çıkartmış olduğunuz dosyalar CS ve VB için oluşturulmuştur. Hangi programlama dili ile projenizi geliştiriyorsanız onun içeriğini kopyalıyorsunuz.
5.
Geliştirmekte olduğunuz MVC Framework web projesinin bilgisayarınızda olduğu klasöre gidiyorsunuz ve kopyalamış olduğunuz dosyaları yapıştırıyorsunuz ve benzer dosyaları değiştireyim mi diye soran ekranda evet seçeneğini seçiyoruz.



6. Artık projenizin tasarımı indirmiş olduğunuz tasarıma göre güncellenmiştir. Yapmanız gereken son işlem [YourProjectName] yazan yerleri kendi projenizin ismi ile değiştirmek olacaktır.



Yapılan işlemler sonucunda projenin almış olduğu görünüme bir göz atalım. Bakalım seçmiş olduğumuz tasarım hazırlanmış olan projenin üzerinde nasıl gözüktü.



Artık oldukça şık tasarıma sahip bir web sitesine sahibiz.

Şimdi eklemiş olduğumuz tasarımı bizlerde biraz daha düzenleyerek çok daha görsel bir görünüme getirelim. Örneğin düzenle, detaylar ve yeni oluştur yazılarını ikon olarak değiştirip çok daha anlaşılır bir görünüme kavuşturalım. bu işlemi gerçekleştirmek için yapmamız gereken ister bir tasarımcı tarafında oluşturulmuş olan ister internet üzerinden bulunmuş resimleri yazıların yerine kullanmak olacaktır.

Ekran üzerinde controller üzerinden gelen bilgilere göre işlemlere yönlendirirken Html.ActionLink() 'i kullanıyorduk. Fakat bu yöntem içerisine resim ekleyebilmemiz mümkün değildir. Aldığı parametreler Html.ActionLink("string","ActionStrign",RouteValue") şeklindedir. Projelerde kullanım şeklide aşağıdaki gibi olmaktadır.

<%= Html.ActionLink("Düzenle", "Edit", new { id=item.Id }) %>
|
<%= Html.ActionLink("Detaylar", "Details", new { id=item.Id })%>

Fakat bizim bu noktada yapmak istediğimiz proje eklenmiş ikonları detaylar ve düzenle bölümünde gösterirken linkleri de bu resimler üzerinde aktif olarak kullanılmasını isteyeceğiz. Tabii tekrar hatırlamak gerekirse bu işlemi Html.ActionLink() yardımı ile yapamıyoruz. Bunun için Url.Action() 'ı kullanırsak yapmak istediğimizi gerçekleştirebilir duruma geleceğiz. Çünkü bu parametre olarak Url.Action("ActionName","RouteValue") almaktadır. Bu durumda bizde <a href=""></a> taglarının arasında Url.Action() 'ı kullanırsak istemiş olduğumuz yönteme gelmiş olacağız. Ne gibi derseniz, web sayfalarında link vermek istediğimizde bizden linkin görünebilmesi için bir metin istemektedir. Bizler metin yerine resmi gösterirsek istediğimiz sonuca ulaşmış olacağız. Bu durumda yapmak istediklerimiz kod olarak görmek istersek aşağıdaki gibi bir görünüme sahip olacağız.

<td class="actions edit">
   <a href='<%= Url.Action("Edit", new {id=item.Id}) %>'>
      <
img src="../../Pictures/component_edit.gif" alt="Edit" width="20" height="20"/></a>
</td>
<td class="actions details">
   <a href='<%= Url.Action("Details", new {id=item.Id}) %>'>
      <
img src="../../Pictures/components.gif" alt="Detaylar" width="20" height="20"/></a>
</td>

Düşündüğümüz gibi controller dan gelen action ları link içerisinde tanımladık ve metin gireceğimiz bölümlere projenin içerisinde yer alan resim değerlerini vererek üzerine tıklandığında istenilen değerin detaylarına gitmesine olanak tanıdık. Peki yeni bir kayıt oluşturmak istediğimiz durumda ne gibi bir işlem yapmamız gerekmektedir. Ne gibi bir fark var diyebilirsiniz. Çok ufak bir fark bulunmaktadır. Bu da RouteValue parametresinin bulunmamasıdır. Fakat bizlere biliyoruz ki hem Html.ActionLink() 'te hem de Url.Action() RouteValue parametresi boş bırakılabilmektedir. Bu sebepten ötürüdür ki yeni bir kayıt oluşturma esnasında yukarıda vermiş olduğumuz kod parçasını olduğu gibi kullanmakla beraber yalnızca new{id=item.Id} parametresinin olduğu değeri silmemiz yeterli olacaktır. Yapmış olduğumuz işlemler sonrasında projemizin nasıl bir görünüme sahip olduğuna göz atmak gerekirse,



Oldukça hoş bir uygulamaya sahip olduk. Hem görsel açıdan hem de performans açısından başarılı bir uygulamamız oldu. Fakat değinmek istediğim bir nokta var. Eklemiş olduğumuz resimlerin boyutları oranında sayfanın açılmasında çok ufakta olsa bir yavaşlama gözlemlenmektedir. Bu açıdan resim eklerken boyutlarına mümkün oldukça dikkat ediniz.

Geldik bir MVC Framework yazımızın daha sonuna. Nelere değindiğimize kısaca göz atmak gerekirse, MVC Framework ile hazırlanan uygulamaların varsayılan tasarımının dışına çıkmak için Master Pages üzerinde yapabileceğimiz değişiklikleri bir önceki yazımızda inceledikten sonra bu yazımızda da MVC uygulamaları kullanılabilecek tasarımların yer aldığı galeriden yararlanarak seçmiş olduğumuz tasarımı kendi uygulamamız üzerinde nasıl kullanabileceğimize ve üzerinde düzenleme yapmak istediğimiz hangi adımları ve değişiklikleri yapmamız gerektiğini incelemeye çalıştık. Bir sonraki yazımızda görüşünceye dek, esenlikle kalın...

Umarım yararlı olabilmiştir.

Turhal Temizer
info@turhaltemizer.com

Çarşamba, Temmuz 08, 2009

Asp.Net MVC Framework - Master Pages Kavramı - I

Microsoft 'un web projelerini hazırlarken bizlere mimari tasarıları daha basit ve kullanışlı bir biçimde kullanmamızı sağlayan Asp.Net MVC Framework 'ü daha önceki yazılarımızda detaylı bir biçimde tanımaya çalıştık. Peki neler yapabiliyorduk. Son kullanıcıdan gelen istekler doğrultusunda başka bir sayfaya nasıl yönlendirebileceğimizi, Controller katmanı ile veri tabanı işlemlerini nasıl işleyip görsel sayfaya ileteceğimizi, model katmanı yardımı ile veri tabanı ile haberleşmelerin çok daha basit bir şekilde yapılabileceğini, veri tabanını aktif olarak kullandığımızda nasıl bir uygulama geliştirdiğimizi ve view sayfaları nasıl kolayca oluşturabileceğimizi detaylı olarak daha önceki yazılarımızda inceledik ve neler yapabileceğimizi gördük. Ayrıca uygulamalarımızda MVC tasarımını kullandığımızda daha önceden oldukça fazla uğraştığımız işlemleri ne kadar kolaylıkla yapabildiğimizi defalarca yapmış olduğumuz pratiklerde doğrulamış olduk. Bu yazımızda ise Asp.Net sayfalarında tasarım standardı açısından sıkça kullandığımız Master Pages kavramını MVC Framework 'te kullanım yapısını detaylı olarak inceliyor olacağız.

Asp.Net uygulamaların Master Page kullanmamızın sebebini kısaca hatırlayacak olursak. Benzer tarzda tasarım şablonu kullanacak olduğumuz sayfalarda tekrardan o tasarımsal öğeleri serverdan çağırıp sayfa üzerinde yüklenmemesini beklememek için oluşturulmuş başarılı bir yapıdır. Özellikle tasarım yapısı üzerinde herhangi bir değişiklik yok ise ve sadece içerikler değişecekse çok önemli bir tercih durumundadır. Aynı Asp.Net uygulamalarında olduğu gibi MVC uygulamalarında da Master Page kavramı önemli bir yer tutmaktadır. Varsayılan olan mavi bir tasarımı olan Master Page kullanılmaktadır. Peki biz bu tasarımı değil de kendi tasarımımızı Master Page 'e taşımak istersek neler yapmamız gerekir. Gelin hep birlikte bunu incelemeye çalışalım.

Her zaman olduğu gibi ilk olarak yapmamız gereken Visual Studio 2008 SP1 geliştirme ortamında bir Asp.Net MVC Framework Web uygulaması oluşturuyoruz. Proje dosyasının içerisinden ilk olarak varsayılan olarak oluşturulan Master Page 'in yerini bulalım.



MVC tasarımını dikkate alarak araştırmalarımızı yaptığımızda görsel öğelerin view katmanında olduğunu görürüz. Master Page her yerde kullanılacak bir içerik olduğu içinde view içerisinde Shared klasörünün içerisinde yer alır.

Biz uygulamamızda bu otomatik olarak oluşturulan Master Page 'i kullanmak yerine kendimize bir tane oluşturalım. Ama ilk olarak oluşturulmuş olan Site.Master 'ı siliyoruz. Sonrasında da Add- NewItem yolunu izleyerek web sitesine yeni bir Master Page ekliyoruz.



Master Page 'i sorunsuzca projeye ekledikten sonra nasıl bir içerik oluşturulacağının düşünülmesinin zamanı gelmiştir. Basit olması açısında içeriğe göre değiştirilebilir iki sütun ekleyelim. Bu değişen içerik eklemeyi Asp.Net 'ten de alışık olduğu gibi <asp:ContentPlaceHolder> yardımı ile yapacağız. İçeriği arttırdıktan sonra temel CSS ile Master Page 'in içerisine stil özellikleri de ekliyoruz ve bu yaptığımız işlemler sonrasında elimizdeki değişikler aşağıdaki gibi olacaktır.

View\Shared\Site.Master
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
   <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>

   <style type="text/css">
      html
      {
         background-color:Gray;
      }

      .column
      {
         float:left;
         width:300px;
         border:solid 1px black;
         margin-right:10px;
         padding:5px;
         background-color:white;
         min-height:500px;
      }

   </style>
   <asp:ContentPlaceHolder ID="head" runat="server">
   </asp:ContentPlaceHolder>
</head>
<body>
   <h1>Sitem</h1>

   <div class="column">
      <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
      </asp:ContentPlaceHolder>
   </div>
   <div class="column">
      <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
      </asp:ContentPlaceHolder>
   </div>
</body>
</html>

Eklemiş olduğumuz içerik kontrollerini body 'nin içerisine <div> taglarının arasına yerleştiriyoruz. Ayrıca div taglarının sütün gibi hareket etmesi için stil özelliğine daha önceden hazırlamış olduğumuz column 'u tanımlıyoruz. Yaptığımız bu işlemler sonucunda Master Page 'in görünümü aşağıdaki gibi olacaktır.



Basit fakat bizlerin hazırlamış olduğu bir Master Page 'e sahip olduk.

Master Page 'i Kullanan View Sayfa Oluşturmak

Asp.Net uygulamalarında Master Page 'ten yararlanarak web sayfaları oluşturabilmemiz mümkündü. Bunun bize en büyük yararı oluşturmuş olduğumuz sayfalarda Master Pages üzerinde belirtmiş olduğumuz içerik kontrol alanlarının düzenlenebilmesi ve diğer taraflar üzerinde herhangi bir değişiklik yapmadan hazırlıyor olmamızdır. MVC Framework 'ten yararlanarak hazırlamış olduğumuz web sayfalarında da Master Page Asp.Net uygulamalarında olduğu gibi kullanılmaktadır.

View klasörünün içerisinde yer alan Home klasörünün üzerinde sağ tıklama sonrasında karşımıza gelen menüden Add - NewItem seçeneğine tıklayarak ekrandan MVC View Content Page i seçerek Master Page 'i kullanabileceği bir web sayfa oluşturmaya başlıyoruz.


Sayfa tipimizi seçip ekle dediğimizde hazırlamış olduğumuz Master Page 'ler den istediğimizi seçmek için bir ekran çıkacaktır.


Tamam dedikten sonra artık Master Page 'i kullanan bir web sayfası uygulamamızda oluşturulmuş olacaktır. Oluşturulan sayfanın arka plan kodları aşağıdaki gibi oluşturulmuştur.

View\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
</asp:Content>

Standart olarak projelere eklenmiş olan *.aspx sayfalardan farklı olarak HTML ve Body tagları yer almaktadır. Bu taglar Master Page de oluşturulduğu için yalnızca belirttiğimiz içerik kontrol alanları sayfada gözükmüştür ve sayfa içerisinde kullanıcılara göstermek istediğimiz içerikleri buralardan yayınlarız. Örnek olması açısında body taglarının içerisine eklemiş olduğumuz <asp:content> 'lerin içerisinde biraz değişiklik yaparak aldığımız sonuca hep birlikte çok atalım.

View\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   İlk içerik kontrol alanı
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
   İkinci içerik kontrol alanı
</asp:Content>

Yaptığımız düzenleme sonrasında ekran değişikliğimiz aşağıdaki gibi olacaktır.



Yapılmış olan değişikler sonrasında web sayfamızın içeriği istediğimiz gibi olmuştur.

Master Page yardımı ile oluşturulan view sayfanın içeriğini düzenlemek

İlk olarak düzenleme yapağımız yer sayfamızın başlığı olacaktır. Oluşturmuş olduğumuz web sayfası internet tarayıcısında açıldığında pencerenin en üst kısmında yer alan bölümü düzenleyelim. Asp.Net ten ve diğer bütün web sayfası kodlama yapılarından alışık olduğumuz üzere title bölümünde belirtmemiz yeterli olacaktır.

Sayfamızın markup kod tarafında en üstte yer alan <Page> </Page> bölümün aralığının içerisinde yer alan title özelliğini değiştirerek sayfa başlığını sorunsuzca oluşturmuş oluruz.


Yapmış olduğumuz işlemi hazırlanmış olan Master Pages ile ilişkilendirerek tekrardan yapalım. Bu durumda ilk olarak oluşturulan Master Pages içerisine koyduğumuz içerik kontrol alanlarını hatırlamamız gerekir ve bir tane head bölümünün içerisine <asp:contentplaceholder> ekledik. Alana başlık, meta ve diğer birçok kriteri ekleyebilmemiz mümkündür. Bu özellikten yararlanarak aspx sayfasının içerisinde aşağıdaki değişiklikleri uyguluyoruz.

View\Home\Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   <title>Başlık buraya yazılacak</title>
   <meta name="description" content="İçindekiler buraya" />
   <meta name="keywords" content="ana arama kriterleri buraya" />

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   İlk içerik kontrol alanı
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
   İkinci içerik kontrol alanı
</asp:Content>

Asp.Net uygulamaları ile uygulamadığımız tekniklerin birebir aynısıdır. Bu örneklerin bu kadar detaylı olarak gösterilmesinin sebebi Master Pages kavramının temel yapısının alışık olduğumuz Asp.Net Master Pages kavramından bir farkının olmadığını da göstermek amacıyladır. Yapmış olduğumuz işlemler sonrasında karşımıza gelen ekran görüntüsü aşağıdaki gibi olacaktır.



Yaptığımız işlemler sonucunda gayet başarılıyız. :)

Bu yazımızda Asp.Net MVC Framework ile hazırlanmış olan uygulamalarda Master Pages kavramını nasıl kullanabileceğimizi ve içerik düzenlemelerini nasıl kullanabileceğimizi detaylı bir biçimde incelemeye çalıştık. Bir sonraki MVC Framework yazımızda Master Pages kavramını incelemeye devam ederken veri tabanı işlemleri ile ilişkilerine de detaylı bir biçimde değineceğiz.

Umarım yararlı olabilmiştir.
info@turhaltemizer.com

Salı, Haziran 23, 2009

Asp.Net MVC Framework - Model Kavramı

Asp.Net MVC Framework ile gelen web proje şablonunun kullanımını ve detaylarını incelemeye başladığımız serimizde üç temel katmandan sonuncusu olan model yani veri tabanındaki tablolarını nesne olarak kullanabilmemize olanak tanıyacak yapıyı incelemeyerek serimize devam ediyoruz.

MVC Framework ile uygulamalar geliştirirken eğer veri tabanı işlemlerini de kullanmak istiyorsak model katmanı içerisinde nesne modelimizi oluşturarak işlemlerimizi yapabilmemiz mümkün olacaktır. Asp.Net ile veri tabanı uygulaması geliştirmek istediğimizde ya Enterprise Library ya NHibernate ya da SqlHelper gibi connection pooling ten tutunda daha bir çok veri tabanı işlemini bünyesinde yapabilen projeleri kullanırdık. .Net Framework 3.0 'ın çıkışı ile bu işlemlerimizi LinQ to SQL ile de yapabilir duruma geldik. Zaman ilerleyip .Net 3.5 'in çıkışı ile Ado.Net Entity Framework yapısı ile tanıştık, SP1 'i ile de projelerimizde kullanmaya başladık. Genel olarak hem Linq to SQL hem de Ado.Net Entity Model O/RM modelini daha kolay ve anlaşılabilir biçimde gerçekleştirebilmemize olanak tanımaktadır.

Genel olarak MVC Framework' te model veri tabanı işlemlerimizi yapabilmemiz için gerekli olan tablo, StoreProcedure ve function gibi işlevleri nesne olarak tanımlayıp daha sonrasında controller katmanınında gerekli işlemleri yaparak kullanabilmemize olaran tanımaktadır.

Yazımızı incelerken Ado.Net Entity Data Modeli inceleyerek devam edeceğiz.

Modeli oluşturabilmek için ilk olarak bir veri tabanına ve bunun içerisinde yer alan tablolara ihtiyacımız olacaktır. Bu sebepten ötürü ilk olarak veri tabanını oluşturuyoruz. Biz şirket isimli veri tabanını oluştururak ilk adımı tamamlıyoruz. Sonrasında aşağıdaki kolonları tabloya ekliyor ve adını SirketSektor olarak belirliyoruz.



Artık veri tabanını ve tabloyu oluşturduğumuza göre MVC uygulamasını oluşturup model kavramını incelemeye başlayabiliriz.

Ado.Net Entity Data Model Oluşturulması

Ado.Net Entity Data Model daha öncede bahsettiğimiz .Net Framework 3.5 SP1 ile Visual Studio ide mize eklenmiştir. İlk olarak MVC proje şablonundan MVC web uygulamasını oluşturuyoruz. Model klasörünün üzerinde sağ tıklama yaparak yeni bir data model ekliyoruz.



Sonrasında karşımıza çıkan ekranda Generate From DataBase seçeneğini seçerek ilerle diyoruz.



Veri tabanına erişebilmemiz için gerekli bağlantı ayarlarının yapılması gereken ekrana sıra geldi. Burada veri tabanı bağlantı bilgilerimizi ekliyoruz.



Oluşturmuş olduğumuz veri tabanı tablosunu projemize model olarak eklediğimizde bize oluşturulan nesne yapısı aşağıdaki gibidir.


Veri modelini MVC Framework ile hazırlamış olduğumuz web projesine sihirbaz yardımıyla adım adım nasıl ekleyeceğimize göz attık. Eklemiş olduğumuz modeli designer ekranında isim ve benzeri özelliklerini değiştirebilmemiz mümkündür. Veri tabanını model olarak projemize ekledik ve kullanabilir bir duruma getirdik. Şimdi oluşturmuş olduğumuz modeli diğer sınıflarda da kullanabilmek için ilk olarak projemizi derliyoruz. Derledikten sonra modeli kullanmak istediğimiz controller sınıfına Model isim alanını ekliyoruz.

Entity Framework ile Veri Tabanı Kayıtlarına Select işlemi Uygulamak

Daha önceki yazılarımızdan hatırlayacağınız üzere kullanıcıların kullanacağı sayfalara ilişkin verileri controller sınıflarında hazırlardık. Index sayfasında gösterilecek veriler için Index() metodu kullanılır ve içeriği ona göre doldurulur. Controller içerisindeki metottan da otomatik view ekle dediğimizde bize bir liste mi oluşturmak istediğimizi soruyor. Bu bizim yaptığımız işlem sonucunda ToList() yardımı ile sorgumuzu tamamlayacağımızı göstermektedir.

Controller\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;

namespace ModelInside.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        MoviesDBEntities _db;

        public HomeController()
        {
            _db = new MoviesDBEntities();
        }

        public ActionResult Index()
        {
            ViewData.Model = _db.MovieSet.ToList();
            return View();
        }
    }
}

Ado.Net Entity Framework veri modeli üzerinde oluşturulmuş olan veri tabanı objesine erişebilmek için ilk olarak değerimizi yüklüyoruz. Sonrasında _db objesine veri tabanı nesnelerine erişebilmemiz için gerekli EDML sınıfımızı tanımlıyoruz. Bu işlemler sonucunda artık projemizde veri tabanı nesnelerini kullanabilir duruma gelmiş bulunuyoruz. Bu işlemleri gerçekleştirdikten  artık tablo üzerinde işlemleri yapabiliriz. Yukarıdaki kod parçasında da görüleceği üzere index() sayfasında verilerimizi göstermek istiyoruz. Bu işlemleri daha önceden select sorguları yazarak yapmamız gerekiyordu. Fakat Linq To Sql ile artık kullanımına alıştığımız nesnesel veri tabanı öğeleri var. Bu özelliklerden MovieSet 'i kullanarak belirtilen tablo içerisinde ki bütün verileri bir List olarak döndürebilmemiz mümkündür. Bu kısa yöntemi LinqToSQL ile yazmış olsaydık nasıl bir kod parçası yazacağımıza kısaca bir göz atalım.

ViewData.Model = _db.MovieSet.ToList(); //Ado.Net Entity Framework ile
ViewData.Model = (from m in _db.MovieSet select m).ToList(); //LinqToSQL ile

LinqToSql ile yazılmış sorgunun metot olarak kullanılmış hali Ado.Net Entity Model de olan yapıdır. Basitçe hazırlamış olduğumuz index metodunun view sayfasını oluşturarak yazımıza devam edelim.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<mak53.Models.Film>>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
   <h2>
       Index</h2>
   <div>
      <% foreach (var item in ViewData.Model)
      { %>
           Film Adi:
           <%= item.Film_Adi %>
           <br />
           Yonetmen:
           <%= item.Yonetmen%>
           <br />
           <%= Html.ActionLink("Edit", "Edit", new { id = item.Id })%>
           <%= Html.ActionLink("Delete", "Delete", new { id = item.Id })%>
           <hr />
       <% } %>
       <%= Html.ActionLink("Add Movie", "Create") %>
    </div>
</asp:Content>

Foreach yardımı ile sorgumuz sonucunda dönen verileri sayfamızda gösterebilmesine olanak tanınır. Index metodunu index view ı ile ilişkilendirdiğimizde karşımıza çıkan sonuç aşağıdaki gibi olacaktır.



Entity Framework ile Veri Tabanı Kayıtlarına Insert işlemi Uygulamak

Daha önceki yazılarımızda da defalarca nasıl insert işlemini gerçekleştireceğimize değinmeye çalıştık. Bu yazımız tamamen sql işlemlerine odaklı olduğu için daha farklı bir kod yazımı ile işlemlerimizi gerçekleştireceğiz. Fakat kısaca hangi metotlarda hangi işlemleri yapacağımızı kısaca tekrardan değinelim. Insert işlemlerini gerçekleştirmek için controller sınıflarındaki create metotlarını kullanmamız gerekmektedir. Form koleksiyonu olan metotta gerekli veri ekleme işlemleri yapar ve veri sonucunu create metodu içerisinde tamamlanır.

Yukarıda değindiğimiz işlemleri gerçekleştiren kod bloğu aşağıdaki gibi olacaktır.

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

//
// POST: /Home/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
   var filmEkle = new Film();

   //Deserialize (Listeye ekliyoruz...)
   TryUpdateModel(filmEkle, new string[] {"Film_Adi", "Yonetmen"}, collection.ToValueProvider());
   if (string.IsNullOrEmpty(filmEkle.Film_Adi))
      ModelState.AddModelError("Film_Adi", "Film adini hatali girdiniz");
   if (string.IsNullOrEmpty(filmEkle.Yonetmen))
      ModelState.AddModelError("Yonetmen", "Yonetmen bilgilerini hatalı girdiniz..");
   //Bilgiler doğruysa filmi kaydediyoruz,
   if(ModelState.IsValid)
   {
      _db.AddToFilm(filmEkle);
      _db.SaveChanges();
      return RedirectToAction("index");
   }
   return View(filmEkle);
}

Form üzerinden toplanan bilgiler ile veri doğrulaması yapıyoruz, sonrasında da gerekli tabloya veri ekleme işlemini gerçekleştirmiş oluyoruz. Veri tabanına verinin eklendiği satırlar _db_addToFilm(filmEkle) ve _db.SaveChanges() 'tır. TryUpdateModel metodu bize kullanıcılar tarafında girilen verileri kontrol etmemize olanak tanır. Validation kontrolü gibi çalışmaktadır.

Bu işlemler sonucunda otomatik olarak Create view 'ı oluşturduktan sonra projemizi derleyip çalıştırıyoruz. Herhangi bir veri girmeden kayıt yap dediğimizde aşağıdaki gibi bir sonuç alınmaktadır.



İki alan için kontrol yapmıştık ve istediğimiz sonucu aldığımızı görüyoruz. Basit bir şekilde validation kontrollü olarak insert işlemini nasıl gerçekleştireleceğine değinmeye çalıştık.

Entity Framework ile Veri Tabanı Kayıtlarına Update işlemi Uygulamak

MVC uygulamalarında güncelleme işlemlerini gerçekleştirmek için edit metotlarının kullanıldığını ve temel olarak hangi işlemleri uygulamamız gerektiğini detaylı bir biçimde incelemiştik.
Herkese mutlu günler diliyorum. Güncelleme işlemlerinde dikkat edilmesi gereken en kritik nokta tek bir kayıt üzerinde güncelleme yapılacağı için seçilen kayıta doğru sonucu getirebilmektedir.

public ActionResult Edit(int id)
{
   var filmToGuncelle = _db.Film.First(m => m.Id == id);
   ViewData.Model = filmToGuncelle;
   return View();
}

//
// POST: /Home/Edit/5

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection collection)
{
   var id = Int32.Parse(collection["id"]);
   var filmToGuncelle = _db.Film.First(m => m.Id == id);

   TryUpdateModel(filmToGuncelle, new String[] {"Film_Adi", "Yonetmen"}, collection.ToValueProvider());
      if (String.IsNullOrEmpty(filmToGuncelle.Film_Adi))
   ModelState.AddModelError("Film_Adi", "film adini hatali girdiniz");
      if (String.IsNullOrEmpty(filmToGuncelle.Yonetmen))
   ModelState.AddModelError("Yonetmen", "Yonetmen bilgilerini giriniz");

   if(ModelState.IsValid)
   {
      _db.SaveChanges();
      return RedirectToAction("index");
   }
   return View(filmToGuncelle);
}

var filmToGuncelle = _db.Film.First(m => m.Id == id); kod parçasında hangi kayıtın güncelleneceği bilgisine ulaşıyoruz. Diğer satırlarda ise yeni bir kayıt oluşturma işlemimde de olduğu gibi verileri kontrol ediyoruz ve en sonunda işlemleri doğruluyoruz.

Entity Framework ile Veri Tabanı Kayıtlarına Delete işlemi Uygulamak

Veri tabanında veri silme işleminde güncelleme işleminde olduğu gibi bir gerekli id 'ye ilişkin kayda ulaştıktan sonra entity modelinde yer alan delete metodunu kullanarak işlemi tamamlıyoruz.

public ActionResult Delete(int id)
{
   var filmToSil = _db.Film.First(m => m.Id == id);

   _db.DeleteObject(filmToSil);
   _db.SaveChanges();

   return RedirectToAction("index");
}

Veri silme işlemini başarılı bir şekilde gerçekleştirmiş bulunuyoruz. Sonuç olarak yazımızda nelere değindiğimize göz atmak gerekirse, entity data model i nasıl oluşturacağımıza, projemize nasıl ekleyeceğimize ve eklemiş olduğumuz bu data model yardımı ile select,update,insert ve delete işlemlerini incelemeye çalıştık.

Umarım yararlı olabilmiştir.

Pazar, Mayıs 24, 2009

Asp.Net MVC Framework - View Kavramı

ASP.NET MVC Framework incelemeye View katmanı ile devam ediyoruz. Bu yazımızda Asp.Net MVC View, View Data ve HTML Helper kavramlarına değinip detaylı bir biçimde açıklamaya çalışıyor olacağız. Yazımızı tamamladığımızda MVC uygulamalarında View oluşturabilmeyi, Controller üzerinden gelen verileri view üzerinde gösterebilmeyi ve kendi html helper 'ımızı oluşturabilmeyi yapabiliyor olacağız.

Asp.Net MVC Framework - View 'ı Anlamak

Çok uzun zamandır web uygulamaları geliştiriciler tarafından hazırlanmakta ve kullanıcıların kullanımlarına sunulmaktadır. Asp.Net veya Active Server Page (ASP) kullanırken son kullanıcıdan gelen istekler doğrultusunda yapılacak işlemleri arka plan kodlarında işlemi gerçekleştirir ve Controller kavramı tam olarak işlemezdi. Ayrıca aspx ya da Asp sayfaların içerisine yönetilebilir kodların yazıldığı bir çok proje görebiliriz. Bu işlemin olması injection ataklarından tutunda yaptığımız projenin yavaş çalışmasına kadar bir çok olumsuz faktör ile bizi karşı karşıya bırakmaktadır. MVC Framework ile geliştirdiğimiz uygulamaların View sayfalarında ise sadece HTML kodların yazılmasına olanak tanınmaktadır. Sebebi ise performansın dışında gereksiz yere server 'a zorlayan işlemleri view sayfalarda kullanmamak. Çünkü bir işlem yapılmayacak dahi olsa view sayfaların açılmaktadır. Eğer ki kullanıcıların görecekleri sayfalara yönetilebilir kodlar eklersek sayfa açıldığında bu kodlarda işlenecek, sayfanın serverdan çağırılması esnasında yüklenmesi için geçecek zamanda da bandwith in dolmasına sebep olacaktır.

MVC uygulamalarında Controller katmanında olan sınıflarda oluşturulan metotlar ile eşleştirilmiş Viewlar üzerinde işlem yapılır. Controller üzerindeki metotlar 'da MVC 'ye göre Action işlemini gördüğünü daha önceki yazılarımızda incelemiştik. Kısacası MVC Framework 'te oluşturulan Viewler, Controller katmanında oluşturulan sınıflarda yer alan metotlar yani Action lara göre hazırlanır ve kod tarafında sadece html kodlar yer almaktadır.

MVC Framework ile varsayılan olarak oluşturulan HomeController.cs sınıfında Details() ve Index() metotlarını aşağıdaki gibi oluşturalım. Hatırlayacağınız üzere Controller da oluşturulan metotların isimleri Action olarak geçmektedir.

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
             return View();
        }

        public ActionResult Details()
        {
             return RedirectToAction("Index");
        }
    }
}

İlk olarak inleyeceğimiz Action Index() olacak ve URL içerisinde nasıl gösterileceğine de göz atacağız.

/Home/Index

İkinci olarak Details() Actionına ve URL 'de nasıl gözükeceğine göz atalım.

/Home/Details

Oluşturulan metotlarda geri dönüş değeri view olmalıdır. ActionResult kullanımında geri dönüş değerlerinin neler olacağını daha önceki yazılarımızda incelemiştik. Index() metodu açıldığı sayfada isteğe cevap verilmesi için View() ı kullanmaktadır. Details() ise onu ilişkilendiren bir istek geldiğinde Index view ına yönlendirme işlemini yapmaktadır.

Index() actionının geri dönüş değeri olan View(); 'ı web sunucunu nasıl algıladığına göz atmak gerekirse,

/View/Home/Index.aspx

Yukarıda verdiğimiz yol web sunucuna giden adrestir. Peki bu bize ne anlama gelmektedir. En baştan itibaren View yapacağı ana işi belirtmektedir. Home eşleştirileceği Controller 'ın adını, Index Controller içerisindeki Action (Metot) adını belitmektedir.

Details() 'te olduğu gibi başka bir view 'a yönlendirmek istediğimizde elimizle ya da sistemden gelen bir parametre ile harici bir view adı veririz. Bunu web sunucumuzun nasıl anladığına göz atmak gerekirse,

View("sertur"); kullandığımızda /View/Home/sertur.aspx şeklinde olacaktır.

View a İçerik Eklemek

Şimdiye kadar View lar hangi amaçla oluşturulmakta ve Controller 'dan nasıl kullanıldığına değindik. Şimdi dinamik olarak HTML 'i nasıl kullanabileceğimize değinmeye çalışacağız.

Şimdi Index view 'ında şu anın zamanını HTML nasıl göstediğimizi bir hatırlayalım.

View\Home\Index.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
   <head id="Head1" runat="server">
       <title>Index</title>
   </head>
   <body>
      <div>
          <% Response.Write(DateTime.Now);%>
      </div>
   </body>
</html>

HTML sayfada günün zamanını sağlayan kod parçası <% Response.Write(DateTime.Now);%> dır. Tabii şimdiden dediklerinizi duyar gibiyim. "Eğer böyle kullanacaksak MVC kullanmanın anlamı ne? Azcıkta burada düzenleme yapsalardı" der gibisiniz. :) ASPX sayfalarımızın içerisine C# kod yazdığımızda da <% %> yazım şeklini kullanır ve içerisine scriptlerimizi C# olacak şekilde yazardık. MVC 'de ise HTML tarafına yönetilebilir kod yazılmasının yanlış olduğundan bahsetmiştik. Microsoft çalışanları da bu tür sık kullanımları görerek ufak kolaylıklar geliştirmişlerdir. Örneğin web sayfalarında bir değer göstermek için Response.Write() sık sık kullanmaktayız. Bu sebepten ötürü kullanmak istediğimiz sadece <%= %> kullanmamız yeterli olacaktır.

Örnek ile göstermek gerekirse,

View\Home\Index.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
   <head id="Head1" runat="server">
       <title>Index</title>
   </head>
   <body>
      <div>
          <%= DateTime.Now %>
      </div>
   </body>
</html>

İki işlem sonucunda da kullanıcının gördüğü aynı olacaktır. Ayrıca bize bir katkısı da html sayfada daha az metin kullanacağımız için sayfa boyutu daha da azalacak ve sayfanın bir öncekine oranla daha hızlı açılmasına olanak tanınmış olacaktır.

HTML Helper Kullanımı ile View İçeriğinin Oluşturulması

HTML Helper nesnelerini çağırarak View sayfamızında içeriğine çok hızlı ve kolayca oluşturabilmemiz mümkündür. HTML Helper metotları işlemleri sonucunda string tip üretmektedir. HTML Helper 'da standart HTML elementleri kullanılmaktadır. Bunları;

Html.ActionLink: <a> elementi oluşturarak bir action metoduna link verilmesini sağlar.
Html.BeginForm: <form> elementini oluşturur.
Html.CheckBox: Checkbox; yani <input type="checkbox"...> elementi oluşturur.
Html.DropDownList: <select..><option>..</option>.....</select> elementlerini(WebForm'lardan tanıdığımız DropDownList'in çıktısı) oluşturur.
Html.Hidden: HTML içerisinde gizli alan; yani <input type="hidden"...> elementi oluşturur.
Html.ListBox: <select multiple="multiple"..><option>..</option>.....</select> elementlerini(WebForm'lardan ListBox'ın çıktısını) oluşturur.
Html.Password: Şifre için metin kutusu oluşturur(<input type="password"...>)
Html.RadioButton: <input type="radio"....> elementi oluşturur.
Html.TextArea: Birden fazla satırı olan bir metin kutusu oluşturur(<textarea....> elementi).
Html.TextBox: Metin kutusu oluşturur(<input type="text"....> elementi).

olarak sıralayabilmemiz mümkündür.

Şimdi HTML helper kullanarak basit bir örnek oluşturalım. Örneğimizde BeginForm(), TextBox() ve Password() elementleri yer alsın.

View\Home\Index.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
       <title>Login Form</title>
    </head>
    <body>
       <div>

          <% using (Html.BeginForm())
          { %>
  
             <label for="UserName">User Name:</label>
             <br />
                <%= Html.TextBox("UserName") %>

             <br /><br />
  
             <label for="Password">Password:</label>
             <br />
             <%= Html.Password("Password") %>
  
             <br /><br />
  
             <input type="submit" value="Log in" />
  
         <% } %>
 
      </div>
   </body>
</html>

Response.Write() yerine <%= %> kullanmamızın daha kolay olacağından bahsetmiştik. Bu sebeple TextBox() ve Password() kullanırken bu kullanım şeklini tercih ettik. Yaptığımız işlemler sonrasında karşımza çıkan görünüm aşağıdaki gibi olacaktır.

Gördüğünüz üzere sadece HTML helper ları kullanarak istediğimizi gerçekleştirdik. Peki, HTML kullanaraj bu işlemi yapmak isteseydik yazmamız gereken kod parçacığının nasıl olacağına değinelim.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
       <title>Login Form</title>
    </head>
    <body>
       <div>
       <form method="post" action="/Home/Login">

       <label for="userName">User Name:</label>
       <br />
       <input name="userName" />

       <br /><br />

       <label for="password">Password:</label>
       <br />
       <input name="password" type="password" />

       <br /><br />
       <input type="submit" value="Log In" />

       </form>
      </div>
   </body>
</html>

İki yöntemde de sorunsuz bir şekilde çözüm aldığımızı gördük. Ancak MVC kullanmak istediğimiz durumlarda HTML helper kullanmak çok daha yararlı olacaktır. Değindiğimiz ve bir süre daha değineceğimiz örnekler geliştirilen uygulamalar için çok basit kalabilir. Örneğin aklınıza GridView() kontrolü yok mu diye gelebilir. Verdiğimiz listeden de görebileceğiniz gibi yoktur. Ancak yazımızın devamında göreceğimiz üzere HTML Helper özellikleri kullanarak kendimiz GridView() 'ı oluturacağız.

View Sayfalara Verilerin Taşınması
Controller içerisnde View sayfalara veri aktarılması mümkündür. View Data özelliği ile bu işlemler gerçekleştirilebilir. Bu özellik gönderilen verilerin tamamını bir pakete alarak view sayfada kullanılabilir bir biçimde kullanılabilmesine olanak tanımaktadır.

ViewData özelliğini bir örnek ile incelemek gerekirse,

Controller/UrunController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
         public ActionResult Index()
         {
              ViewData["Mesaj"] = "Merhaba Dünya!";
              return View();
         }
    }
}

ViewData özelliğine view sayfada göstereceğimiz veriyi atıyoruz. Sonrasında Html.Encoding() özelliği ile gelen veriyi çözümleyerek son kullanıcı ekranında görünmesini sağlıyoruz. Html.Encoding() controller lardan gelen string verileri view sayfalarda görülecek şekilde çözümleyerek görüntülenmesine olanak tanımaktadır.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Index</h2>
    <%= Html.Encode(ViewData["Mesaj"]) %>
</asp:Content>

Html.Encode() yardımıyla Merhaba Dünya! mesajımızı basitçe gösteriyor olduk. Bu işlemimiz sonucunda ekran görüntüsü aşağıdaki gibi olmaktadır.



Basit merhaba dünya örneğimiz dışında veri tabanında alınan verileri view sayfasında da göstermek istediğimiz ViewData ve Html.Encoding() kullanılması mümkündür.

Harici HTML Helper (Yardımcı HTML) Kullanımı
MVC uygulamalarında View sayfalarında gösterilen sayfa içeriğinin HTML Helper (yardımcı HTML) yardımıyla gösterildiğini görmüş ve geçmiş örneklerimizde bunları detaylı bir biçimde incelemiştik. Normalde alışık olduğumuz <form> elementinin yerine Html.BeginForm() özelliği kullanılmaktadır. HTML elementlerinin en sık kullanıldığı zamanlarda <input> ve <img> en çok tercih edilen elementlerdi. Zaman geçtikçe bunların yerini Asp.Net kontrolleri almıştır. Fakat Asp.Net kontrolleri de arka planda derlendiğinde <input> olduğu gözlenmiştir. Bu sebepten bizlere HTML Helper kütüphanesi hazırlanmış ve kullanımımıza sunulmuştur. Tekrardan kullanabileceğimiz en temel HTML Helper metotlarına göz atmak gerekirse;

•Html.ActionLink()
•Html.BeginForm()
•Html.CheckBox()
•Html.DropDownList()
•Html.EndForm()
•Html.Hidden()
•Html.ListBox()
•Html.Password()
•Html.RadioButton()
•Html.TextArea()
•Html.TextBox()
şeklinde sıralayabilmemiz mümkündür.

Not: View sayfalar kullanılan elementlerine HTML Helper 'ı çözümlerken <%= %> kullanımı ile <% %> birbirlerine eş değildirler. İkinci şekilde kullanmak istediğimizde uygulama hata verecek ve çalışmayacaktır.

HTML Helper ile Statik Metot Oluşturma

Basit olarak HTML Helper da kullanılmak üzere yeni bir statik metodu nasıl oluşturabileceğimize değineceğiz. Yapacağımız örnekte view sayfaya eklenecek kontrolde sabit değeri ve kullanıcının göreceği metin olacaktır.

Helpers\LabelHelper.cs
namespace MvcApplication1.Helpers
{
    public class LabelHelper
    {
        public static string Label(string target, string text)
        {
             return string.Format("<label for='{0}'>'{1}'</label>", target, text);
        }
    }
}

Geri dönüş değeri string olan statik bir metot hazırladık. Artık bizimde bir HTML Helper metodumuz vardır. Şimdi bunu View sayfada nasıl kullanacağımızı açıklamaya çalışalım. İlk olarak yapmamız gereken sayfaya Helpers alanını göstermemiz gerekmektedir. Bu işlemi <%@ imports %> ile yapacağız. Sonrasında ise <%= %> içerisine LabelHelper.Label  'ı kullanarak istediğimiz sonucu alabiliriz. Şimdi yazı olarak anlattıklarımızı uygulamalı olarak nasıl yapacağımıza değinmeye çalışalım.



<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MvcApplication1.Helpers" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
   Home Page
</asp:Content>

   <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
   <p>
   <div>
      <%using(Html.BeginForm())
      {%>

         <%=LabelHelper.Label("firstName", "First Name:") %>
         <br />
         <%=Html.TextBox("firstName")%>
         <br /><br />
         <label for="Password">Password</label>
         <br />
         <%=Html.Password("Password")%>
         <br /><br />

         <input type="submit" value="Giris" />

      <%}%>
   </div>
   </p>
</asp:Content>

View sayfamızda istediğimiz değerler sorunsuzca görülmektedir.



Artık kendimize ait bir HTML Helper sınıfımızı vardır. Fakat biz bu metotları kullanmak istediğimizde hangi sınıf adıydı diye hatırlamamız gerekecektir. En iyi yöntem Html Helper metotlarını extension lar yardımı ile kullanılmasına olanak tanımak olacaktır.

HTML Helper Uzantılı(Extension) Metotlar Oluşturmak

HTML Helper ile çalışırken MVC Framework bünyesinde oluşturulmuş olan metotları kullanarak view sayfalarımızın içeriklerini oluştururuz. Bu yöntem standart HTML elementlerinden yararlanılarak oluşturulmuş metotları projelerimizde Html Helper olarak kullanabilmemize olanak tanımaktadır. Şimdi biz örneğimizde HTML helper sınıfına ek bir metot ekleyerek html. koyduğumuzda bizim hazırladığımız metodunda kullanılmasını nasıl olacağını incelemeye çalışacağız.

Helpers\LabelExtensions.cs
using System;
using System.Web.Mvc;

namespace MvcApplication1.Helpers
{
    public static class LabelExtensions
    {
        public static string Label(this HtmlHelper helper, string target, string text)
        {
            return String.Format("<label for='{0}'>{1}</label>", target, text);
        }
    }
}

Visual Studio üzerinde intellisense i kullandığımızda view sayfada html helper için extension olduğuna bize belirtmektedir.



Yaptığımız değişikliğe göre index.aspx sayfamızı güncellersek sonuç aşağıdaki gibi olacaktır.
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MvcApplication1.Helpers" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
   Home Page
</asp:Content>

   <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
   <p>
   <div>
      <%using(Html.BeginForm())
      {%>

         <%=Html.Label("firstName", "First Name:") %>
         <br />
         <%=Html.TextBox("firstName")%>
         <br /><br />
         <label for="Password">Password</label>
         <br />
         <%=Html.Password("Password")%>
         <br /><br />

         <input type="submit" value="Giris" />

      <%}%>
   </div>
   </p>
</asp:Content>

Evet. Artık Html helper metotları gibi kullanılabilen bir metodumuz oluşmuştur.

Veri Tabanı Tablolarında Verilerin Gösterilmesi

Yazımızda şu ana kadar View üzerinde yapabileceğimiz temel işlemleri ve kendi istediğimiz doğrultuda HTML yardımcısı oluşturmayı incelemeye çalıştık. Yazımıza veri tabanı işlemleri sonucunda dönen verileri View sayfaları da html yardımcıları kullanılarak nasıl gösterebileceğimizi inceleyerek devam ediyoruz.

Konumuzu örnek üzerinde anlatmaya devam ediyoruz. İlk olarak yapılması gereken bir veri tabanı oluşturmak ve içerisine bir tablo eklemek olacaktır. Yazımızda kullanacağımız veri tabanının adı Sirket, Tablonun adı da Film olacaktır. Tablonun alanları ve tiplerine aşağıdaki resimden erişebilirsiniz.



Veri tabanı ve tabloyu oluşturduğumuza göre artık MVC Framework ile oluşturmuş olduğumuz projemize ekleyebiliriz. Bu işlemi yaparken Ado.Net Entity Framework 1.0 'ı kullanacağız. Projeye ekleyebilmek için Model klasörünün üzerine sağ tıklama yapıp çıkan ekranda Ado.Net Entity Data Model 'i seçerek ekle diyoruz. Sonrasında boş bir model oluşturacağız dedikten sonra veri tabanının ne olacağı gibi bilgileri girerek bir sonrasında modeli uygulamaya eklenmiş oluyor.


Artık film tablosu modele dönüştürüldü ve üzerinde işlem yapılmak üzere hazır durumdadır. Eğer model üzerinde bir işlem yapıyorsanız yapmanız gereken o dosyayı kaydetmek, sonrasında ise projeyi bir kere derlemek olacaktır. Sonrasında kullanılabilir sorunsuzca entity model kabiliyetlerini kullanarak işlemleri yapabiliriz.


Film Controller Oluşturuyoruz

Controller hakkındaki ayrıntılı bilgileri daha önceki yazılarımızda değinmiştik. Şimdi ise hızlıca controller 'ı oluşturup işlemlerimizi yapmaya devam edeceğiz. İlk olarak en başta projeye UrunController.cs sınıfını oluşturuyoruz.



Sonrasında karşımıza geçen ekranda Controller adını belirterek oluştur diyoruz.



Sınıfı oluşturduktan sonra düzenleme yapmaya başlıyoruz. Index() metoduna tablo içerisindeki verileri çekerek işlemi yapıyoruz.
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
    public class FilmController : Controller
    {
        //
        // GET: /Film/

        public ActionResult Index()
        {
            var entity = new SirketDbEntities();
            return View(entity.FilmlerSet.ToList());
        }
    }
}

Veri tabanına eriştik ve sonuçlar artık view sayfada kullanılmak üzere hazır durumda bizi bekliyor. Şimdi view sayfayı oluşturarak işlemlerimize devam ediyoruz. Otomatik olarak oluşturulması için Index() metodunun üzerinde sağ tıklama yaparak AddView seçeneğini seçiyoruz. Sonrasında karşımıza gelen ekranı aşağıdaki şekline getirerek veri tabanından gelen verileri gösteren view sayfamızı oluşturmuş oluruz.



Otomatil olarak oluşturulan view sayfasındaki kodlar aşağıdaki gibi olmuştur.



<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.Filmler>>" %>

   <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
      Index
   </asp:Content>

   <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

   <h2>Index</h2>

   <table>
      <tr>
         <th></th>
         <th>
            Id
         </th>
         <th>
            Film_Adi
         </th>
         <th>
            Yonetmen
         </th>
         <th>
            Cikis_Tarihi
         </th>
      </tr>

      <% foreach (var item in Model) { %>

      <tr>
         <td>
            <%= Html.ActionLink("Edit", "Edit", new { id=item.Id }) %> |
            <%= Html.ActionLink("Details", "Details", new { id=item.Id })%>
         </td>
         <td>
            <%= Html.Encode(item.Id) %>
         </td>
         <td>
            <%= Html.Encode(item.Film_Adi) %>
         </td>
         <td>
            <%= Html.Encode(item.Yonetmen) %>
         </td>
         <td>
            <%= Html.Encode(String.Format("{0:g}", item.Cikis_Tarihi)) %>
         </td>
      </tr>

      <% } %>

   </table>

   <p>
      <%= Html.ActionLink("Create New", "Create") %>
   </p>

</asp:Content>

Bu işlemler doğrultusunda ekran görüntüsü aşağıdaki biçimde olacak ve isteğimizi karşıladığını görüyor olacağız.



TagBuilder Sınıfını Kullanarak Html Helper Oluşturmak

TagBuilder sınıfını kullanarak resim ve benzeri dosyaları projede gösterebilmemiz mümkündür. Bu işlemleri gerçekleştirirken diğer view sayfalarda da kullanıldığı gibi html yardımcı (HTML Helper) yardımcı kullanılarak gerçekleştirilir.

TagBuilder sınıfınının genel yapısına göz atmak gerekirse,

AddCssClass() = Yeni bir css sınıfı eklenmesine olanak tanır. class=""
GenerateId() = Özniteliklerini ekleyerek id işlenir. Bu metot değişikliklerin periyodik olarak ID bazlı değişiklik olanağı tanır.
MergeAttirbute() = Özniteliklerini ekleyerek id işlenir. Aşırı yüklenmiş metotlar için kullanılmaktadır.
SetInnerText() = İç metin ayarlamak için kullanılır.
ToString() = Daha fazla etiket oluşturulmasına olanak tanımaktadır.

TagBuilder sınıfının dört önemli özellikleri vardır.

Attribute = Temsil edilen tüm etiketlerin özniteliklerini taşır.
IdAttributeDotReplacement = Tekrardan gösterilen etiketlerin GenerateId() metodu kullanılarak değişik periyotlarda işler.
InnerHTML = Temsil edilen etiketin iç içeriğini sunar.
TagName = Etiketi gösterir.

TagBuilder sınıfı

TagBuilder sınfı aslında gerçek bir kullanılan ana sınıf değildir. StringBuilder sınıfı miraslanarak oluşturulmuş bir sınıftır.


Resim Html Helper Oluşturuyoruz
TagBuilder sınıfının metotlarından GenerateId() ve MergeAttribute() metotlarını kullanarak controller ı oluşturulalım.

using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.Helpers
{
   public static class ResimHelpers
   {
      public static string Resim(this HtmlHelper helper, string id, string url, string alternateText)
      {
         return Resim(helper, id, url, alternateText, null);
      }

      public static string Resim(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
      {
         // Create tag builder
         var builder = new TagBuilder("img");

         // Create valid id
         builder.GenerateId(id);

         // Add attributes
         builder.MergeAttribute("src", url);
         builder.MergeAttribute("alt", alternateText);
         builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

         // Render tag
         return builder.ToString(TagRenderMode.SelfClosing);
      }

   }
}

TagBuilder sınıfını kullanarak kendi HTML Helper metodumuzu oluşturuyoruz ve view sayfada kullanılabilir duruma getiriyoruz. Bu noktada yapmamız gereken view sayfada Html.Resim() metodunu kullanmak olacaktır.
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MvcApplication1.Helpers" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
   <h2>Index</h2>
   <%= Html.Encode(ViewData["Mesaj"]) %><br />
   <%= Html.Resim("img1", ResolveUrl("~/Content/editor_turhal.jpg"), "Turhal Temizer")%>
   <%= Html.Resim("img1", ResolveUrl("~/Content/editor_turhal.jpg"), "Turhal Temizer", new {border="4px"})%>
</asp:Content>

İşlemlerimiz sonucunda ekran görüntüsü aşağıdaki gibi olacaktır.



Yazımızda detaylı olarak view kavramına, Html Helper 'a ve kendi HTML helper metotlarımızı oluşturmayı detaylı bir biçimde incelemeye çalıştık. Bir sonraki Asp.Net MVC Framework yazımızda Model kavramını incelemeye çalışacağız.

Herkese mutlu günler diliyorum.

Cuma, Mayıs 22, 2009

Asp.Net MVC Framework - Controller ve Action Kavramı

Asp.Net MVC Framework web projesi şablonunu incelerken başlattığımız yazı dizimize Controller katmanına daha detaylı değinerek devam ediyor olacağız.

MVC Framework ‘te en önemli parçalarından biride Controller ‘dır. MVC patterninde son kullanıcılar tarafında yapılan istekler doğrultusunda route map yardımıyla gerekli controller sınıfına yönlendirerek işlemleri gerçekleştirmeye başlatır. Controller üzerinde modelle ilişkili olarak veri tabanı işlemleri, yönlendirme işlemleri, hesap işlemleri gibi bir web sitesi için en temel işlemlerin yapıldığı katmandır.

Controller ‘ı Anlamak

Asp.Net MVC ‘ de kullanıcılar tarafında gelen istekleri alan işleyen ve geri ileten katman olarak tanımlayabiliriz. İnternet tarayıcısında parçalı olarak her controller için ayrı bir istek yapılır. Ufak bir örnek adres üzerinden değinmek gerekirse;

http://localhost/Urun/Index/7 başarılı bir gösterim olabilir.

Controller adı adres çubuğunda Urun olarak geçmektedir. Bu Controllers\ klasörünün alt dizininde yer alan UrunController.cs sınıfından gelmektedir. Bu sınıf gelen isteklere karşı gerekli sonuçları döndürmek için kullanılmaktadır. Controller ların bir diğer özelliği ise yapılan bir işlem sonrasında işlenecek daha parçalar var ise başka bir controller sınıfına aktarmaktadır.

Basit olarak UrunController.cs sınıfına göz atalım;

Controller\UrunController.cs
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class UrunController : Controller
    {
         //
         // GET: /Urun/

         public ActionResult Index()
         {
              // Add action logic here
              return View();
          }

     }
}

Harici olarak oluşturulan controller sınıfları System.Web.Mvc.Controller sınıfı miraslanarak oluşturulmaktadır. Ayrıca controller sınıflarında oluşturulan metotlarda en çok dikkatimizi çeken Action kullanımıdır.

Action ‘ı Anlamak

Controller sınıflarını daha da işlevsel kılan Action kullanımıdır. Son kullanıcıdan gelen istek doğrultusunda hangi işlemi yapacağını belirtilen controller sınıfında yer alan metodlar yani action ‘lar yapmaktadır.

http://localhost/Urun/Index/7 adres çubuğunda Urun kontrollerken Index/7 belirtilen meto da 7 parametresine göre işlem yapması anlamına gelmektedir.

Controller ‘ı incelerken vermiş olduğumuz kod bloğunu örnek olarak kullanırsak, UrunController sınıfında yer alan Index() metodunu action ‘dır. Action public metot olmalıdır. C# metodları varsayılan olarak private oluşturulmaktadır. Bu sebepten ötürü action metotlarının public olarak belirtilmesi gerekmektedir.

Action metotlarının aşırı yüklenmesi kabul gören bir kullanım biçimi değildir. Action özellikle daha özelleştirilmiş kullanıma odaklandığı için benzer metot isimleri ile birden fazla işlem yapılması çalışma zamanında sorunlara sebep olabilmektedir.

Action Result ‘ı Anlamak

Controller da kullanılan action lar action result ile geri dönüşleri vardır.

1. ViewResult: HTML ve Markup sunar (Represent).
2. EmptyResult: Sunumu sonlandırır.
3. RedirectResult: Sunulan linki yeni bir adrese yönlendirmeye yarar
4. JsonResult: Java Script Object ‘leri Ajax ile birlikte kullanılabilir bir duruma getirir.
5. JavaScriptResult: Java Script leri sayfada kullanılabilir biçimde sunar.
6. ContentResult: Metin içeriği sunar.
7. FileContentResult: İndirilebilir dosyaları sunar (Binary içerik ile).
8. FilePathResult: İndirilebilir dosyaları sunar (Dosya yolu ile).
9. FileStreamResult: İndirilebilir dosyaları sunar (Stream dosyalar için).
View result kullanılarak hazırlanmış bir metoda göz atalım.

Controller\KitapController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class KitapController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Action sonucunda ViewResult ile HTML view ‘e dönecektir. Index() metodunda view adına göre geri dönüşü yapacaktır.

ViewResult() ve View() metotları Controller sınıfında türetilerek oluşturulmuştur. Controller ‘ın temel sınıfları;

1. View: Action sonucunda ViewResult ‘a yönlendirilir.
2. Redirect: Action sonucunda RedirectResult ‘a yönlendirilir.
3. RedirectToAction: Action sonucundan RedirectToRouteResult ‘a yönlendirilir (action yardımıyla yönlendirilir).
4. RedirectToRoute: Action sonucunda RedirectToRouteResult ‘a yönlendirilir (route yardımıyla yönlendirilir).
5. Json: JsonResult döndürür.
6. JavaScriptResult: JavaScriptResult döndürür.
7. Content: Action işlemi sonucunda ActionResult döndürür.

İnternet tarayıcılarında Controller üzerinde action çağırıldığında View() metodu kullanılmaktadır. Kullanılan bir diğer Action metodu ise RedirectToAction ‘dır. Bu metot yapılan işlemler doğrultusunda geri dönülmesi gerekiyorsa kullanılmaktadır.

Eğer ki Details metodunda ki id parametresine gelen değer HasValue ‘dan farklıysa bizim belirttiğimiz bir view HTML sayfaya yönlendirilmesini talep eden bir controller sınıfı hazırlayalım.

Controller\KullaniciController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class KullaniciController : Controller
    {
        public ActionResult Details(int? id)
        {
              if (!id.HasValue)
                   return RedirectToAction("Index");
              return View();
        }

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

Şimdi vereceğimiz örnek ise içeriklerin gösterimi ile ilgili. Index metodunda ContentResult metodunu kullanarak belirtilen içerisi göstermektedir.

Controller\DurumController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class DurumController : Controller
    {
        public ActionResult Index()
        {
            return Content("Merhaba Dunya!!!");
        }
    }
}

İçeriği ContentResult metodu da bizim girebilmemiz dışında oluşturulan metotların geri dönüş değerlerine göre de otomatik olarak belirtilebilmesi mümkündür.

Controller\IsController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class IsController : Controller
    {
        public DateTime Index()
        {
             return DateTime.Now;
        }
    }
}

Index() metodunda action olarak DateTime nesnesini geri dönüş değeri almaktadır. İnternet tarayıcısında DateTime ‘ın geri dönüş değeri metin olarak View sayfada gösterilmektedir.

Controller Oluşturuyoruz…

Asp.Net MVC Framework ‘te Controllerları nerelerden nasıl ekleyebileceğimize ve detaylarını inceleyerek yazımıza devam ediyoruz. Bu işlemlerimizi Visual Studio geliştirme ortamı üzerinde örneklerimizi yapıyor olacağız.

Menü üzerinde Projeye Menü Eklenmesi

MVC Framework web projesi şablonu ile oluşturulmuş proje üzerinde yeni bir controller sınıfı eklemek için Controllers klasörünün üzerinde fare ile sağ tıklama ile Add->New -> Controller yolunu izleyerek ekleyebilmemiz mümkündür.



Sonrasında karşımıza controllerin adını gireceğimiz bir ekran çıkmaktadır.



Controller\PersonelController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class PersonelController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Action Metotunun İskeleti

Biraz önce anlattığımız gibi kolay bir şekilde controller sınıfı ekleyebilmemiz mümkündür. Anlattığımız temel işlemlerin dışında bir de Create, Update ve Details Action metotlarını da basitçe ekleyebilmemiz mümkündür. Sadece yapmamız gereken Controller adını verdiğimiz ekranda senaryolarında oluşmasını isteyip istemediğimizi soran bölüme onay vermek olacaktır.



Seçeneği onaylayığ UrunController sınıfını ekle dediğimizde aşağıdaki sınıfı bize Visual Studio otomatik olarak oluşturmaktadır.

Controller\UrunController.cs
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class UrunController : Controller
    {
        //
        // GET: /Urun/

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

         //
         // GET: /Urun/Details/5

         public ActionResult Details(int id)
         {
             return View();
         }

         //
         // GET: /Urun/Create

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

         //
         // POST: /Urun/Create

         [AcceptVerbs(HttpVerbs.Post)]
         public ActionResult Create(FormCollection collection)
         {
             try
             {
                   // TODO: Add insert logic here

                  return RedirectToAction("Index");
              }
              catch
              {
                  return View();
              }
          }

          //
          // GET: /Urun/Edit/5

          public ActionResult Edit(int id)
          {
               return View();
           }

           //
           // POST: /Urun/Edit/5

          [AcceptVerbs(HttpVerbs.Post)]
          public ActionResult Edit(int id, FormCollection collection)
          {
              try
              {
                   // TODO: Add update logic here

                   return RedirectToAction("Index");
              }
              catch
              {
                     return View();
               }
          }
     }
}

Oluşturulan sınıf yardımıyla Index, Details, Update, Edit gibi temel veri tabanı işlemleri daha hızlı hazırlayabilmemize olanak tanır.

Controller Sınıfı Oluşturmak

Şu ana kadar sürekli olarak ya daha önceden oluşturulmuş olan controller sınıflarını inceledik ya da Visual Studio yardımıyla kolayca oluşturduk. Şimdi ise boş bir sınıf oluşturarak kendimiz bir controller sınıfı nasıl oluşturabileceğimizi incelemeye çalışalım.

Visual Studio ‘da controllers sınıfına sınıfımızı el ile ekliyoruz. Şimdi yapacağımız adımlara bir göz atalım.

1. Controllers klasörüne bir sınıf ekliyoruz.
2. Eklemiz olduğumuz sınıfın adı muhakkak Controller ile bitmelidir.
3. Sınıfı düzenlerken System.Web.Mvc.Controller ile miraslaşması gerekmektedir.

Bu işlemleri tamamladığımızda kendimiz sorunsuzca bir controller sınıfı oluşturmuş oluruz.



Controller\YaziController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class YaziController : Controller
    {
        public string Index()
        {
            return "Merhaba Dunya!!!";
        }
    }
}

Index() metodunu internet tarayıcısı üzerinde çağırmak istediğimizde http://localhost:40700/yazi adresini belirtmeniz yeterli olacaktır. Bize Merhaba Dünya!!! Sonucunu döndürecektir.

Not: localhost:40700 ‘deki 40700 port numarasıdır. Bu numara her yeni bir Asp.Net Development Server oluşturulduğunda birbirinden farklı bir biçimde oluşturulabilir. Eğer değişmesini istemiyorsanız projenin özelliklerinden statik olmasını sağlar ya da web sayfanızı localhost altına alıp hiç port numarasına gerek kalmadan kullanabilirsiniz.

Action Oluşturuyoruz…

Yazımız boyunca controller sınıflarının ne işe yaradığını detaylı bir şekilde öğrendik. Şimdi ise yeni bir controller action nasıl oluşturulur, özellikleri nelerdir incelmeye çalışıyor olacağız.

Controller sınıfları içerisinden gelen istekler doğrultusunda işlemler action metotları ile gerçekleştirilir. Şimdi action metotlarının nasıl oluşturulabildiğini incelemeye çalışalım.

Controller Action Ekliyoruz…

HomeController sınıfının içerisine Index() action metodunun dışında birde MerhabaDe() action metodunu oluşturuyoruz. Şimdi bu değişikliği hemen yapalım. J

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public string MerhabaDe()
        {
            return "Merhaba";
        }
    }
}

Action metot oluştururken dikkat etmemiz gereken kriterler aşağıdaki gibidir.

• Bu metot public(genel) olmalıdır .
• Metot statik olamaz.
• Metodun bir uzantısı olamaz.
• Metoda ilişkin bir yapıcı, alıcı ya da verici olamaz
• Metotta açık genel türleri olamaz.
• Bu metot controller temel alınarak hazırlanmış bir metot değildir.
• Metot parametreleri Ref veya out içeremez.

Controller action metotları geri dönüş değerleri olarak string, DateTime gibi tipleri alabilirler. Asp.Net MVC Framework string olmayan bir action metot parametresini tarayıcı tarafında string değer gönderildiği durumlarda dönüştürme işlemini yapamaz ve hata mesajı verir.

Action metotlarda kullanılacak parametrelerde boş değer de gelme olasılığını düşünerek tipler nullable olarak belirlenir.

Genel bir action metodu oluşturalım. Fakat bu oluşturma işleminde bu metoda action değilsin diyerek bir de çelişkiye sebep olduralım. Bu durumda controller ı ve action adının çağırdığımız durumda bize nasıl bir tepki vereceğine hep bir birlikte bir göz atalım.

Controller\SirketController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [NoAction]
    public class SirketController : Controller
    {
        public string SirketSirri()
        {
            return "Bu bilgi şirket sırrıdır.";
        }
    }
}

İnternet tarayıcımızda Sirket/SirketSirri yazarak action metodumuzu çağırdığımızda nasıl bir tepki ile karşılaşacağımıza göz atalım.

Gördüğünüz üzere Sirket controlleri ve SirketSirri() metodu olduğu halde bize isteğiniz bulunamamaktadır gibi hata mesajı vermektedir. Bunun sebebi Action metodumuzun başına sen action değilsin dememizden kaynaklanmaktadır.

Bir yazımızın daha sonuna geldik. Bu yazımızı da Controller sınıflarını ve action metotlarını detaylı bir biçimde incelemeye çalıştık.

Herkese mutlu günler diliyorum.