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

Perşembe, Mayıs 20, 2010

Silverlight Business Application – WCF RIA Services

Web uygulamaları günler geçtikte daha bir görsel ve daha bir işlevsel olmaktadır. Bu gelişmenin Microsoft gerçekleşmesini sağlayan teknoloji ise Silverlight 'tır. Başlarda basit animasyon işlemleri yaparken şu anda WCF servisleri ile validation kontrolleri ile ve diğer bir çok özelliği ile Asp.Net uygulamalarına alternatif olarak düşünebilir seviyeye gelme yolunda son sürat ilerlediğini gözlemliyoruz. Bu süreçlerin ilerlemesi ile iş uygulamalarında da Silverlight düşünülmeye başlanmıştır. Bildiğiniz üzere Asp.Net MVC Framework yardımı ile veri, nesne ve görsel katmanları ayrı ayrı kullanabilmemize olanak tanıyan bir şablon ile karşımıza gelmektedir. Bu uygulama şablonunda özellikle Entity katmanı yardımı ile veri işlemleri üzerinde yapacak olduğumuz işlemleri rahatça yapılabilmesi mümkündür. Silverlight Business Application yardımı ile de hazır bir şablon gelmekte ve işleri kolaylaştırabilmektedir. Silverlight Business Application hakkında temel bilgi ve proje şablonu hakkında bilgi edinmek için burada yer alan yazıdan yararlanabilirsiniz.

Silverlight Business Application, WCF RIA servisleri yardımı ile veri işlemlerini domain servisler ile uyumlu bir şekilde gerçekleştirebilmesi mümkündür ki alt yapısı da bu entegrasyon üzerine kurulmuştur. Biz de bu yazımızda WCF RIA servislerini kullanarak veri üzerinde ekleme, silme ve gösterme işlemlerini inceliyor olacağız.

Not: WCF RIA servisleri konusunda ayrıntılı bilgi edinmek için buradan yararlanabilirsiniz.

Silverlight Business Application Silverlight 3 ve 4 araçları içerisinde yer alan iş süreçlerine uyumluluğu olan bir proje şablonudur. Yeni bir proje oluşturulurken kullanıcı üyelik, sisteme giriş, windows authentication yardımı ile sisteme giriş yapabilme, ana sayfa gibi temel yapıları bünyesinde katmansal bir yapı ile bulundurduğu için tercih edilebilecek oldukça güzel bir proje şablonudur. Şimdi adım adım basit bir örnek üzerinde neler yapabileceğimize incelemeye başlayalım.

Not: Geliştirilecek olan uygulama, Visual Studio 2010 üzerinde Silverlight 4 kurulu bulunan bir bilgisayar üzerinde yapılacaktır. Ayrıca veri tabanı sunucusu olarak SQL Server 2008 Express Edition kullanılıyor olacak. Uygulama esnasında kullanılacak olan veri tabanını buradan indirip kendi veri tabanı sunucusunuza ekleyip kullanabilir ve yazı içerisinde yapılan örnekleri benzer veriler ile uygulayabilirsiniz. Dosyanın boyutu 3 mb 'dir.

Uygulama geliştirirken Entity Framework ve WCF RIA Domain servisi kullanıyor olacağız. Visual Studio üzerinde yeni proje oluştur diyip Silverlight proje sablonları arasından Silverlight Business Application 'ı bulup projemizi oluşturuyoruz.

mak92_1

Karşımıza Silverlight ve web projesi olmak üzere içerisinde iki proje olan şablon ile açılmaktadır.

mak92_2

Projeyi oluşturduktan sonraki bir diğer adım WCF RIA Servisini uygulama hangi projeden link alarak kullanacağıdır. Bu amaçla Silverlight projesinin özellikler ekranında bu özelliğin aktif olup olmadığını kontrol ediyoruz.

mak92_3

Web projesine WCF RIA Servisi linkini vererek kullanıcı tarafında domain servislerinin kullanılabilmesini de aktif duruma getirmiş oluyoruz. Bu sayede entity framework ile gösterecek olduğumuz verileri web uygulamasını referans göstererek her yerde kullanabilmemiz mümkün olacaktır. Peki, geliştirilecek olan uygulamalarda WCF RIA servisi kullanmanın ne gibi avantajları olacaktır.

Katmansal uygulamalarda geliştirme kolaylığı, .Net ile geliştirilen uygulamaların sunucu-kullanıcı arasındaki etkileşimi sağlamayı kolaylaştırır.
Varlıkların karşılıklı paylaşılması, Model sınıfları, doğrulama (Validation) kuralları ve diğer veri ilişkileri
Kullanıcı tabanlı destekleyiciler, Otomatik veri eşlemeleri, sayfalama, güncelleme, değişiklik takibi

şeklinde temel faydalarını kısa başlıklar altında sıralayabiliriz.

 mak92_4

Web sunucusunu Domain Service ve Model 'den oluşmaktadır. Model Entity Modelinden oluşur ve içerisinde CRUD işlemleri olarak adlandırılan create,read,update ve delete işlemlerini barındırır. Domain Services ise Entity Data model 'de bulunan işlemlerin aktarılmasında yer alır. İşleyiş mantığı ise Silverlight kullanıcısından alınan verilerin model katmanı ile hangi yöne yönleneceğinin belirlenmesi ile gerekli veri mesajları Domain Context 'e iletilir. Buradan işi asıl yapacak olan web sunucusuna verilerin aktarılması işi ise WCF ile yapılmaktadır.

RIA Domain servielerininin temel olarak sağladıkları aşağıdaki gibidir.
WCF Servisleri, Bütün WCF özellikleri kullanılabilir. Servis referansları eklenebilir.
Özelleştirilmiş taban sınıfları, LinqToEntities (Ado.Net Entity Data Model), LinqToSQL (Linq To SQL Data Model) ve Authentication bazlı sınıfların oluşturulabilmesi.

WCF RIA servisleri yalnızca verilerin taşınması değil aynı zaman gösterilmesini sağlamaktadır. Proje içerisine eklenmiş olan DomainServise gösterilen veri modelini veri kaynağı olarak gösterdikten sonra oluşan objeleri silverlight formlar üzerine sürükle bırak yöntemi ile GridView görünümünde verilerin gösterilebilmesi ve düzenlenebilmesi olanağı vardır. Ayrıca bu grid içerisinde ListBox, Combox gibi kontrollerin kullanılabilmesi mümkündür. Ayrıca grid üzerinde gösterilmekte olan verileri düzenlenmesi anında Silverlight 'ın sağladığı bütün kontrollerin kullanılabilmesi olanağı da vardır. Peki ne tür veri kaynakları kullanabiliriz. Silverlight Business Application 'da WCF RIA servislerinin dışında .Net uygulamaları geliştirirken kullanılan bütün veri kaynaklarının kullanılabilmesi mümkündür. Tavsiye ise daha önceden açıkladığımız sebeplerden ötürü WCF RIA servisleridir.

Yapmış olduğumuz kısa tanımlamalar, açıklamalar ve uygulama içerisinde WCF RIA servislerinin link edildiğini görmemizin sonrasında uygulamamızı geliştirmeye başlayabiliriz.

RIA servislerinden bu kadar bahsettikten sonra öncelikli olarak web projesinin içerisinde services klasörünün içerisinde yer alan Domain Services sınıflarına göz atalım. İlk etapta iki tane sınıf bulunmaktadır. Bunlar, Authentication ve UserRegistration servisleridir. Bu sınıflarda gerekli servislerin içlerinde User nesnesini kullanarak kullanıcıların sismete giriş yapma veya kayıt olma işlemlerini yapabilmeleri mümkündür. Şimdi uygulamayı çalıştırarak oluşturulan login ve yeni kullanıcı formlarına hemen göz atalım.

mak92_5

Kullanıcı giriş ekranı ise,

mak92_6

şeklindedir. Daha önceden vermiş olduğumuz linkte yer alan veri dosyasını web uygulamasında yer alan App_Data klasörüne ekleyerek sonrasında da Server Explorer içerisinde tablolara bakarak veri dosyasının doğru olarak eklendiğini kontrol ediyoruz. Sonrasında ise veri modelini oluşturmamız gerekmektedir. Bu amaçla Ado.Net Entity Framework ten yararlanacağız. Web projesine yeni bir öğe ekle seçeğini kullanarak ADO.NET Entity Data Model 'i seçerek adımları tamamlıyoruz. Tablo kısmında aşağıda yer alan resimdekileri eklememiz yeterli olacaktır.

mak92_7

Bu adımdan sonra Entity Model tanımlanmış oluyor. Sonrasında sorunsuzca çalışması ve eklenen DLL 'lerin temp dosyalarının oluşması için bir kere uygulamayı derliyor ve sonrasında adımlarımıza devam ediyoruz. Şimdi uygulamaya Domain Service sınıfını ekleyeceğiz. Bunun için web uygulamasında services klasörünün üzerinde sağ tıklama yapıyoruz ve yeni bir öğe ekle diyoruz. Sonrasında web tabının içerisinde yer alan Domain Service Class ekliyoruz. Sonrasında bizden veri kaynağımıza ilişkin kullanacağımız tabloları seçmemizi isteyecektir. Bu ekranı aşağıdaki şekilde hazırlıyoruz.

mak92_8

İşlemi tamamladıktan sonra EventManagerDomainService.cs ve EventManagerDomainService.metadata.cs isimli iki dosya oluşturmaktadır. Metadata dosyasının içerisinde tablolarda yer alan öğelerin nesnesel olarak metotlarda özellikleri yer alır. EventManagerDomainService içerisinde ise metadata içerisinde yer alan nesnelerden yararlanarak hazırlanmış olan CRUD işlemlerinin yapılacağı metotlar yer almaktadır.

Sıra işin biraz daha görsek kısımlarına geldi. Verileri göstermek için gerekli altyapıyı hazırladık. Şimdi bu verileri kullanarak son kullanıcıya değerler göstermemiz gerekmektedir. Bunun için Silverlight uygulamasının içerisinde Views klasörünün içerisinde yer alan Home.xaml ekranından yararlanıyor olacağız. Bu sayfayı açtıktan sonra data menüsünün altında yer alan Show Data Source 'a tıklayarak WCF RIA servisleri ile gelen veri kaynaklarını görüntüleyebiliriz.
mak92_9

Eklemiş olduğumuz tablolar veri kaynağı kısmında bizim kullanımızı hazır olarak beklemektedir.

mak92_10

EventManagerDomainContext içerisinde yer alan objelerin üzerine inceleme yaptıysanız GridView şeklinde hazırlanmış olduğunu ve direk kullanılabilir durumda olduğu dikkat çekmektedir. Bize bu durumda yalnızca form üstüne bunlardan herhangi birini sürükleyip verileri görüntelemek kalıyor. Bu yazımızda örnek olarak Event nesnesini kullanıyor olacağız.

mak92_11

Veri gösterme işini başarılı bir şekilde başardık. Sıradaki işlemimiz ise bu veriler üzerinde düzenleme yapmak için neler yapamamız gerektiği olacaktır.

Düzenleme işleminin yapılabilmesi için öncelikli olarak Views klasörüne yeni bir sayfa ekliyor olacağız. Silverlight Business Application ile örneği yaparken sayfaların navigation page olduğu dikkatinizi çekmiştir. Bunun amacı asp.net ve mvc 'den alışık olduğumuz  URL Routing 'e benzer bir yapı içermesinden ve sayfalar arası geçişin URI yardımı ile rahatlıkla yapılabilmesinden kaynaklanmaktadır. Şimdi düzenleme yapacağımız sayfayı ekleyebiliriz. Eklemiş olduğunuz sayfanın <navigation:Page ile başladığını görüyor olacaksınız.

Şimdi ana amacımız grid üzerinden seçilen kaydın değerlerini güncellemektir. Bu işlemi yapabilmek için de seçili olan satırın ID 'sine ulaşıp bu değeri taşımamız gerekmektedir. Bu amaçla formun üzerine bir adet buton ekliyoruz. Butonun içerisinde ID 'den yararlanarak başka bir sayfaya yönlendirecek ve değerleri güncelleyeceğiz. Butonu form üzerine ekledikten sonra üzerine tıklanması anında yapılacak olayları aşağıdaki gibi belirtiyoruz.
private void editEventButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    Event selectedEvent = eventDataGrid.SelectedItem as Event;
    if (selectedEvent != null)
    {
        int eventId = selectedEvent.EventID;
        NavigateToEditEvent(eventId);
    }
}

private void NavigateToEditEvent(int eventId)
{
    Uri target = new Uri("/EditEvent?EventID=" + eventId, UriKind.Relative);
    NavigationService.Navigate(target);
}
YYapmış olduğumuz işlemler yardımı ile Event tablosunun içerisinde yer alan değerlerden seçili olanın ID 'sini yakalayıp EditEvent sayfasına o ID 'den yararlanaraj gerekli yönlendirmeyi yapıyoruz. Şimdi hızlıca yönlendirme işleminin sorunsuzca olup olmadığını test etmek için uygulamayı seçip kontrol edelim.

mak92_12

Sayfayı sorunsuzca yönlendirdik. Şimdi ise bu gelen ID yardımı ile verileri gösterip düzenleme işlemini nasıl yapabileceğimize göz atacağız. EditEvent sayfasına geliyoruz ve Data Source kısmına göz atıyoruz. Verileri gösterirken Event tablosunun içeriğini kullandık ve bu bize otomatik olarak GridView yardımı ile gerçekleştirmiştik. Şimdi aynı işlemi Event tablosunun içerisinde yer alan kolonların detaylarını göstererek yapmak gerekecektir. Bu amaçla Event tablosunun yanında açılan DropDownList 'in içerisinde Detail seçeneğini seçiyor ve EditEvent sayfasına tabloyu sürüklüyoruz.

mak92_13

Detay kısmına getirdikten sonra form üzerinde sürüklediğimizde bize form kontrollerinden oluşan bir şablon çıkacak ve bunlar iki yönlü olarak veriye bağlanmış olacaktır. Sürükleyip bıraktığınızda karşınıza çıkacak olan şablon aşağıdaki gibi olacaktır.

mak92_14

Sırada yapmamız gereken bu formun içeriğini doldurabilmek amacıyla QueryString'ten yararlanarak EventId 'yi yakalamak ve sonrasında ekrana eklemiş olduğumuz buton ile güncelleme işlemini gerçekleştirmektir.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string eventIdString = NavigationContext.QueryString["EventID"];
    int eventId;
    if (int.TryParse(eventIdString, out eventId))
    {
        eventDomainDataSource.FilterDescriptors.Add(
            new FilterDescriptor
            {
                Operator = FilterOperator.IsEqualTo,
                PropertyPath = "EventID",
                Value = eventId
            });
    }
}

private void saveChangesButton_Click(object sender, RoutedEventArgs e)
{
    eventDomainDataSource.SubmitChanges();
}

QueryString ile yakaladığımız EventID 'yi filtre olarak kullanıp sonrasında içerik filtreleme yardımı ile EventID değerine eşit olan değerleri gösteriyoruz. Sonrasında ise Entity Framework 'un güzelliklerinden yararlanarak değişiklikleri kaydet diyerek işlemi tamamlıyoruz. Sonrasında uygulamayı çalıştırıp düzenleme işlemlerini yapıp değiştir dediğimizde yapmış olduğumuz değişikliklerin uygulandığını görmüş oluruz.

mak92_15
Düzenleme işlemlerini nasıl yapabileceğimizi incelemiş olduk. Şimdi ise yeni bir kaydı nasıl ekleyebileceğimizi incelemeye çalışacağız. Yeni bir kayıt eklerken yine Entity katmanından yararlanıyor olacağız. Ayrıca form üzerine var olacak kontrollere önceden bir kaç ön bilgi girerek daha anlaşılır olmasını sağlayacağız. Örneğin tarih kısmında <01.01.2010> gibi örnek bir değer olacaktır.

İşlemlerimize öncelikle bir kayıt ekle butonunu home.xaml sayfasına ekleyerek başlıyoruz. Sonrasında eklemiş olduğumuz tıklanması anındaki olayına aşağıdaki kod parçasını ekliyoruz.

private void newEventButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
    DateTime nowDate = DateTime.Now;
    Event newEvent = new Event
    {
        EventTitle = "<Yeni Aktivite>",
        EventVenueName = "<Yer>",
        EventDescription = "<Açıklama>",
        EventStartDate = nowDate,
        EventEndDate = nowDate
    };

    var ctx = new EventManagerDomainContext();
    ctx.Events.Add(newEvent);
    ctx.SubmitChanges(createOP =>
    {
        NavigateToEditEvent(newEvent.EventID);
    }, null);
}

Entity içerisinde bulunan Events koleksiyonuna varsayılan olarak gösterilecek değerleri ekledikten sonra WCF RIA servisi olarak eklemiş olduğumuz EventManagerDomainContext 'ten yararlanarak yeni kayıt eklenmesi için gerekli işlemleri ekledik. Ayrıca kayıt eklenmesi için gerekli formu aktivite düzenlemek için kullandığımız forma yönlendirmek için NavigateToEditEvent metodunu kullanarak gerekli yönlendirme işlemini gerçekleştirmiş oluyoruz.

Not: EventManagerDomainContext farklı isimler ile projenizin içerisinde bulunabilir. Bu tanımlamayı doğru olarak öğrenebilmek için DataSources tabının içerisinde yer alan veri kaynaklarına bakarak öğrenebilirsiniz.

mak92_10

Yaptığımız işlemler sonraında yeni kayıt girme ekranının nasıl gözüktüğüne hızlıca göz atalım.

mak92_16

Sonuç olarak bu yazımızda Silverlight Business Application proje şablonunda WCF RIA servislerini nasıl kullanabileceğimizi temel CRUD işlemleri üzerinde incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.
 
Kaynaklar

Turhal Temizer

info@turhaltemizer.com

Pazar, Eylül 06, 2009

Asp.Net MVC Framework - Validation İşlemleri - II

Günler geçtikçe ASP.NET MVC Framework hem ülkemizde hem de dünyada yayılmaya devam etmektedir. Geliştirdiğimiz web projelerinin geliştiriciler tarafında hızlı geliştirilebilmesine sağladığı olanaklar ve çalışma zamanındaki performansı ile tercih sebebi olma yolunda emin adımlarla ilerlemektedir. Ayrıca MVC kalıbını yıllardır web kullanıcıları kullanıyordu. Ancak ASP.NET MVC Framework ile birlikte gelen hazır özelliklerin bir çoğunu kendimiz oluşturmak durumunda kalıyorduk. Bu da bize MVC Framework ile geliştirdiğimiz uygulamaların geliştirilebilirliğinin daha da kolay olduğunun ufak bir göstergesidir.

ASP.NET MVC Framework ile yapılabilecekleri ufak örnekler yardımı ile bir süredir inceliyoruz. Bu sefer ise bir önceki yazımızda incelemiş olduğumuz Validation kontrollerini devam yazısı ile incelemeye devam ediyoruz. Bu yazımızda ModelState.AddModelError() ile yapmış olduğumuz hata kontrolünü kendi hazırlayacak olduğumuz sınıf yardımı ile nasıl yapabileceğimizi incelemeye çalışacağız.

Validation kontrolünü yine bir örnek ile inceleyelim ve veri tabanında ders tablosu oluşturalım.

mak60_1
Tabloyu oluşturduktan sonra bir MVC projesi oluşturacağız. Sonrasında ise projeye Entity Framework özelliklerinden yararlanmak için Entity Data Model ekleyeceğiz.

mak60_2
Not: Entity Model ile çalışırken unutulmaması gereken en önemli noktalardan biri model üzerine eklemiş olduğumuz tablo objelerinin isimlerinin veri tabanı ile aynı olmamasıdır. Bu sebepte veri modeline attıktan sonra ismini değiştiriyoruz. Bu açıkladığımız konuları uygularken zorluk yaşıyorsanız daha önce yayınlamış olan ilişkisel yazıları okuyabilirsiniz.

Temel işlemleri yapmaya devam ediyoruz. Diğer yazılarımızda da sıklıkça değindiğimiz verilerin getirilmesi ve yeni bir kayıt oluşturulması durumunda gerçekleşecek işlemleri sağlayacak metotları hazırlayalım. İş katmanı Controller olduğuna göre ve bu işleri ana sayfa üzerinde hazırlayacağımıza göre HomeController içerisinde bahsettiğimiz işlemleri gerçekleştiriyoruz.

using System.Linq;
using System.Web.Mvc;
using ValidationIslemler.Models;

namespace ValidationIslemler.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        private MVCArticleEntities _db = new MVCArticleEntities();
        public ActionResult Index()
        {
            return View(_db.OgretimUyesSet.ToList());
        }

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

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude = "id")] OgretimUyes yeniOgretimUyesiEkle)
        {
            if (!ModelState.IsValid)
                return View();

            try
            {
                _db.AddToOgretimUyesSet(yeniOgretimUyesiEkle);
                _db.SaveChanges();

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

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

Daha önceki yazılarımızda Create metodunu otomatik olarak oluşturur ve içerisinde yazılması gereken işlemleri bizler doldururduk. Fakat bu işlemi direk bizde yapabiliriz. Yeni kayıt işleminin gerçekleşebilmesi için iki adet create metoduna ihtiyaç vardır. Birincisi create edilecek değer bulunamazsa geldiği view 'a döndürür. Bir diğeri ise Create işlemini gerçekleştiren bölümdür. Dikkat edeceğiniz üzere ikinci Create metodunda gelen verinin modele uyumluluğunu da kontrol ediyoruz. Bu durumda ilk Validation kontrolünü gerçekleştirmiş oluyoruz. Bu kontrol esnasında ModelState değeri negatif dönerse yeni kayıt oluştur linkine tıklanan sayfaya geri dönecektir. Ayrıca bu durumda hataya düşüyorsanız elle ya da otomatik olarak oluşturmuş olduğunuz HTML sayfanın Model 'den veri aldığına emin olarak işlemlerinizi gerçekleştirebilirsiniz.

Yazımızın başında da bahsetmiştik, model üzerinde veri kontrollerini yapmak için gerekli işlemleri nasıl oluşturacağımızı inceliyor olacaktık. Bu aşamada ilk olarak projeye eklemiş olduğumuz Ado.Net Entity Model 'in design tarafında otomatik olarak oluşturulmuş olan cs koda göz atalım.

mak60_3

Gördüğümüz kadarı ile model içerisinde erişebildiğimiz sınıflar partial class olarak tanımlanmaktadır. Peki, "partial class neydi?" kısaca hatırlamak gerekirse;

Partial classların ne olduğunu kısaca hatırlamak gerekirse; fiziksel olarak yada aynı fiziksel dosyada (amacına göre ayrı iki .cs dosyasında olması makbul ve mantıklıdır) tanımlanan class tanımlarının tek bir class olarak çalışması ve derlenmesidir. Yani aslında bir sınıfın metotların farklı .cs dosyalarında tanımlayabilmeyi sağlar.

Bu durumda IDataErrorInfo ara yüzünü kullanabileceğimiz sınıfı partial olarak oluşturup içeriğini düzenleyeceğimiz duruma getiriyoruz. Model katmanının içerisine yeni bir sınıf ekliyoruz.

Models\OgretimUyesi.cs
using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi
    {

    }
}

Entity Framework ile hazırlanmış olan data modelde partial sınıflar otomatik olarak oluşturulmaktadır. Entity Framework ile oluşturulan kodlarda otomatik olarak OnChanging ve OnChanged partial sınıfları oluşturulur.

Şimdi bizde oluşturmuş olduğumuz sınıfın içerisine Aşağıdaki metotları ekleyelim.

•OnIdChanging
•OnIdChanged
•OnAkademisyenChanging
•OnAkademisyenChanged
•OnUnvanChanging
•OnUnvanChanged
•OnDersSaatiChanging
•OnDersSaatiChange

OnChanging metotları OnChanged metotlarını tetikleyerek çalışır ve güncelleme işlemlerinde ID özelliklerinden yararlanarak bizim istediğimiz değişiklikleri yapamabilmemize olanak tanır.

Şimdi yukarıdaki bilgilerimizden yararlanarak eklemiş olduğumuz partial sınıfı biraz düzenleyelim. Yapacak olduğumuz değişiklikler ile son kullanıcının web form üzerinden Akademisyen ve Unvan bilgilerini boş girmemesi için gerekli olan kod parçasını oluşturalım.

Yazımızın içerisinde daha öncede bahsettiğimiz gibi Validation işlemlerini yaptığımız durumlarda IDataErrorInfo ara yüzünün özelliklerinden yararlanarak çok daha işlevsel bir hata kontrolü yapabilmemiz mümkündür.

using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi:IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnAkademisyenChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Akademisyen", "Akademisyen bilgisi boş geçilemez.");
        }

        partial void OnUnvanChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Unvan", "Unvan bilgisi boş geçilemez.");
        }
    }
}

Yapmış olduğumuz işlem sonrasında örneğin akademisyen bilgisi boş geçildiğinden _errors Dictionary<> 'sine hata mesajı yazılacak ve kullanıcıya gösterilecektir.

IDataErrorInfo ara yüzü ile oluşturmuş olduğumuz sınıfı birlikte kullanmamız da gerekmektedir. Zaten OgretimUyesi sınıfına ara yüzü eklediğimiz zaman bize otomatik olarak aşadağıki metotları getirmektedir. Bakalım IDataErrorInfo ara yüzünün içerisinde hangi metotlar yer almaktaymış.

public interface IDataErrorInfo
{
    string this[string columnName] { get; }

    string Error { get; }
}

HomeController içerisinde oluşturmuş olduğumuz Crete() kontrolüne ilişkin kontrolleri üzerinde değişiklik yaptığımız OgretimUyesi.cs üzerinde IDataErrorInfo ara yüzünden yararlanarak Validation kontrolleri işlemlerini gerçekleştirdik.

OgretimUyesi sınıfının içerisinde eğer Akademisyen ve Unvan alanları boş geçilirse verilecek olan hata belirtilmiştir. Boş geçilmesi durumunda kolon adını kontrol edecek olan IDataErrorInfo ara yüzü olacaktır. Bu durumda ara yüze ilişkin özelliklerden error 'a istediğimiz kontrol sonucunda hata oluşursa son kullanıcının sayfasında görüntülenmesine olanak tanırız. Ayrıca hata olması sonucunda geri dönüş değeri olarak boş string döndürelim.

Şimdi yukarıda açıklamış olduğumuz özelliklere göre IDataErrorInfo ara yüzü ile ilişkilendirelim ve özelliklerine gerekli değerleri atayalım.

using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi : IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnAkademisyenChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Akademisyen", "Akademisyen bilgisi boş geçilemez.");
        }

        partial void OnUnvanChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Unvan", "Unvan bilgisi boş geçilemez.");
        }

        #region IDataErrorInfo Members

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string columnName]
        {
            get
            {
                if (_errors.ContainsKey(columnName))
                    return _errors[columnName];
                return string.Empty;
            }
        }

        #endregion
    }
}

Artık özellikler sonrasında boş geçilen değerler _errors koleksiyonuna eklecek ve son kullanıcı sayfasında gösterilecektir.

Bu arada yazımız boyunca yaptığımız bütün işlemleri OgretimUyesi sınıfının içerisinde yaptığımızı ve HomeController sınıfında hiç bir değişiklik yaptığımızı unutmayalım.

Sonuç olarak neler yaptığımızı tekrardan bir üstünden geçmek gerekirse, IDataErrorInfo ara yüzü yardımı ile otomatik olarak gösterilen kontrol mesajlarını nasıl oluşturabileceğimize göz attık. Daha sonrasında ise OnAkademisyenChanging() ve OnUnvanChanging partial metotlarını OgretimUyesi sınıfına ekledik. Bu eklediğimiz metotlar yardımı ile Asp.Net MVC Framework uygulamalarında kendimize özgü Validation mesajlarını nasıl gösterebileceğimizi öğrenmiş olduk.

Umarım yararlı olabilmiştir.

Turhal Temizer
info@turhaltemizer.com

Cumartesi, Ağustos 15, 2009

Ado.Net Entity Framework – Entity Model ile Windows Form Uygulamaları ve Bug

Veri tabanı ile ilişkisel olarak yapmış olduğumuz işlemleri Ado.Net Entity Framework ile yaptığımızda çok daha hızlı ve kolay bir şekilde yapabilinmesi mümkündür. Ne kadar basit yapılabileceğine ilişkin basit bir örnek verelim.

Visual Studio 2008 ile Windows From projesi oluşturuyor ve sonrasında entity data model template ‘ini projeye ekliyoruz. edmx ‘in içerisine gerekli olan tabloları ekledikten sonra işlemleri yapmaya başlayabiliriz.

Windows Formun üzerine aşadağıdaki kontrolleri ekliyoruz.

Windows Form

Tasarımı oluşturduktan sonra aşağıdaki kodları ekliyoruz.

using System;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class CourseViewer : Form
    {
        public CourseViewer()
        {
            InitializeComponent();
        }
        private SchoolEntities schoolContext;
        private void closeForm_Click(object sender, EventArgs e)
        {
            schoolContext.Dispose();
            this.Close();
        }

        private void CourseViewer_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();
            ObjectQuery<Department> departmentQuery = schoolContext.Department.Include("Course").OrderBy("it.Name");
            try
            {
                this.departmentList.DisplayMember = "Name";
                this.departmentList.DataSource = departmentQuery;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void departmentList_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                Department department = (Department)this.departmentList.SelectedItem;
                courseGridView.DataSource = department.Course;
                courseGridView.Columns["Department"].Visible = false;
                courseGridView.Columns["CourseGrade"].Visible = false;
                courseGridView.Columns["OnlineCourse"].Visible = false;
                courseGridView.Columns["OnSiteCourse"].Visible = false;
                courseGridView.Columns["Person"].Visible = false;

                courseGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            try
            {
                schoolContext.SaveChanges();
                MessageBox.Show("Changes saved to the database");
                this.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Yukarıdaki kod bloglarını da projeye ekledikten sonra projemizi çalıştırdığımız aşağıdaki gibi bir görünüme sahip olacağız.

Debugging Windows Form

Evet herşey güzel gözüküyor.

Peki, bug nerede?

            {
                Department department = (Department)this.departmentList.SelectedItem;
                courseGridView.DataSource = department.Course;
                courseGridView.Columns["Department"].Visible = false;
                courseGridView.Columns["CourseGrade"].Visible = false;
                courseGridView.Columns["OnlineCourse"].Visible = false;
                courseGridView.Columns["OnSiteCourse"].Visible = false;
                courseGridView.Columns["Person"].Visible = false;

                courseGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
            }
Veri tabanında yer alan tabloların gözükmemesi için görünebilirliğini pasif yapıyoruz. Ancak bu işlem esnasında yanlışlıkla CourseGrade yerine CourseGrades yazdım ve karşımıza aşağıdaki gibi bir sonuç çıkmıştır.

EntityBug

Dikkat ederseniz yanlış yazdığımız bölüm sonrası kapatmış olduğumuz bütün tablo isimleri gözükmüştür.

Ancak her ne olursa olsun Entity Framework ‘ün uygulamalarımıza kattıkları oldukça fazladır. Bu tür Bug ‘lar da .Net Framework ‘ün tamamlanması ile büyük ihtimal ortadan kalkacaktır.

Eğer ki sizler de bu tür buglar keşkefederseniz www.connect.microsoft.com adresinden hata merkezine belirtebilirsiniz.

Umarım yararlı olabilmiştir.

Çarşamba, Temmuz 15, 2009

Asp.Net MVC Framework - Validation İşlemleri - I

Asp.Net ile geliştirdiğimiz uygulamalarda kullanıcı bazlı olarak işlem yaptırmak istediğimizde verilen doğru olarak girilip girilmediğini kontrol etmemiz gerekmektedir. Örneğin böyle bir kontrol yapmadığımızda kişiler kimlik numarasını girmek yerine adını da yazabilmektedir. Bu istenmeyen bir durumdur. Kimlik numarası 11 haneden oluşmakta ve yalnızca rakamlardan oluşmaktadır ki harf girilmesi istenmeyen durumlar arasında gösterilmektedir. Peki bu kontrolü yapmak için nasıl işlemler uygulamamız gerekmekte kısaca bir hatırlayalım. Klasik yöntemlerden birincisi sayfamızın markup kod tarafında Java Script ile hazırlanmış kontrolleri ekleyerek kullanabiliriz. Bir diğer seçeneğimiz *.cs veya *.vb kod tarafında hazırlamış olduğumuz manüel kontroller yardımı ile bu durumu engelleyebilme şansımız vardır. Fakat bu yöntemin çalışması için internet sayfasının en az bir kez server ile haberleşmesi ve yeniden yüklenmesi gerekmektedir ki bu da web sitesinin hızlılığı açısından istenmeyen bir durumdur. Son ve en sık kullanılan özellik ise Asp.Net Validation kontrollerinin kullanılmasıdır. Bu yöntem oldukça başarılı ve bizim kullanmış olduğumuz kontrol üzerindeki işlemimiz tamamlandığı anda kendisini aktifleştiren bir yöntemdir.

Yukarıdaki paragrafta yer alan özelliklerin hepsini okuduktan sonra her şey çok güzel o zaman ben işlemimi Asp.Net Validation kontrolleri yardımı ile gerçekleştireyim şeklinde aklınıza çözüm gelebilir. Evet yapabiliriz. Fakat bizim ana amacımız hazırlanan internet sayfalarınız daha performanslı bir şekilde açılabilmesi olduğu için Validation kontrolleri yerine başka bir kontrol kullanalım. Fakat unutmayalım ki MVC Framework ile hazırlamış olduğumuz uygulamalarda Asp.Net kontrolleri kullanılması mümkündür. Ama biz controller tarafında hazırlayacak olduğumuz işlemler yardımı ile Validation kontrollerini kullanmak istiyoruz. Çünkü bizler web sayfasının markup kodunda asp kontrolleri yerine Html.* şeklinde HTML içeriklerini kullanmak istemekteyiz. Bu yazımız boyunca bu işlemleri nasıl yapabileceğimize detaylı bir şekilde incelemeye çalışıyoruz olacağız.

Validation işlemlerimizi yapabilmemiz için Model kavramını incelerken kullanmış olduğumuz proje üzerinde değişiklikler yaparak başlıyoruz. İlk olarak veri tabanımıza Dukkan isimli bir tablo daha ekliyoruz ve alanları olarak;
• Id
• Name
• Description
• UnitPrice
• Stock
belirledikten sonra Entity modele ekleme işlemini gerçekleştirebilmek için *.edmx ara yüzünün üzerinde sağ tıklama yaptıktan sonra Update Model from Database seçeneğine tıklayarak yeni bir tablo ekleyebileceğimiz ekrana geliyoruz.



Karşımıza gelen ekranda Tables seçeneğinden yeni eklemek istediğimiz tabloyu seçtikten sonra tamam seçeneğine basarak Entity modelinin içeriğindeki tablo sayısını arttırıyoruz. Ayrıca daha önceki yazılarımızda değinmiş olmamıza karşın tekrardan hatırlamak gerekirse, Entity Model 'in içerisine tablo,view ve store prodecure (sp) ekleyebilmemiz mümkündür.



Eklemiş olduğumuz tablo entity modelde gözükmüştür. Bu tabloya ilişkin işlemleri yapabilmemiz için projeye bir tane Controller sınıfı ekliyoruz. İçeriğinde ilk olarak tablo içerisinde yer alan verilerin gözükmesi için index() metodunu dolduruyoruz. Sonrasında da herhangi bir veri yoksa yeni bir kayıt ekleme işlemini yapacağız. Bu noktada dikkat edeceğimiz yer başlamaktadır. Yazımızın başlarında Validation işlemlerini açıklarken en sık kullanım yerinin başında son kullanıcıya veri ekleme izni verilen yerlerde olduğundan bahsetmiştik. İşte bizde bu controller içerisinde yeni bir kayıt eklemek istediğimiz durumda Validation işlemlerini nasıl uygulayabileceğimize göz atacağız. Bunun için Create metodunda aşağıdaki eklemeleri ve düzenlemeleri yapıyoruz.

Controller\ProductController.cs
public ActionResult Create()
{
    return View();
}

//
// POST: /Product/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Dukkans dukkansToCreate)
{

    //Kontrollerin yapıldığı kısımdır.
    if (dukkansToCreate.Name.Trim().Length == 0)
        ModelState.AddModelError("Name", "İsim degeri bos gecilemez...");
    if (dukkansToCreate.Description.Trim().Length == 0)
        ModelState.AddModelError("Description", "Aciklama degerleri bos gecilemez");
    if(dukkansToCreate.UnitStock<0)
        ModelState.AddModelError("UnitPrice","UnitPrice degeri 0 dan az olamaz...");
    if (ModelState.IsValid)
    return Create();
    try
    {
        // TODO: Add insert logic here
        _db.AddToDukkansSet(dukkansToCreate);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

Entity Model 'de yer alan veri tabanı tablosuna ilişkin elemanları tek tek değer kontrolü ettikten sonra bizim belirtmiş olduğumuz özellikler kriterleri kullanıcının girmiş olduğu veriler geçemezse ModelState.AddModelError() ile işlem yapılacak alan için istenilen mesaj verilebilir duruma gelinmiştir. Peki, "bizler hiç kontrol eklemezse varsayılan olarak yaptığı kontroller var mıdır?" şeklinde aklınıza bir soru takılabilir. Cevabı ise, evet vardır. Veri tabanı üzerindeyken tablonuzu oluşturma esnasında alanlardan boş geçilemez olarak tanımlamış olduğunuz alanlarda varsayılan olarak kontrol yapılmaktadır ve yapılan kontrol verilerin girilip girilmediği kontrolüdür.

MVC uygulamalarında kullanıcıların göreceği katmana View denilmekteydi ve bu sayfaları controller da oluşturulmuş olan metotlar yardımı ile basitçe oluşturabiliyorduk. Şimdi tekrardan kısaca bu işleme göz atmak gerekirse,

İlk olarak oluşturmuş olduğumuz metodun üzerine geliyoruz ve sağ tıklama sonrası addView seçeneğine tıklıyoruz.



Bir sonraki adımda karşımıza gelen ekranda Oluşturmak istediğimiz View 'ın adını (eğer vermezsek varsayılan olarak metodun adını alacaktır) ne tür işlem yapacağımızı ve veri sınıfının ne olacağını sormaktadır. Veri sınıfı bölümünde model isim alanı içerisinde yer alan nesnelerden tablomuzun isminin olduğu seçeneği seçmemiz durumunda yapmak istediğimiz işlemler sorunsuzca çalışacaktır. Aksi durumda çalışma anında hata ile karşılacaksınız.



Yaptığımız işlemler sonrasında view sayfasını oluşturmuş bulunuyoruz. Artık bu sayfanın içeriğini inceleyebiliriz.

View\Product\Create.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<FilmUygulama.Models.Dukkans>" %>

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

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

<h2>Create</h2>

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Id">Id:</label>
            <%= Html.TextBox("Id") %>
            <%= Html.ValidationMessage("Id", "*") %>
        </p>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Description">Description:</label>
            <%= Html.TextBox("Description") %>
            <%= Html.ValidationMessage("Description", "*") %>
        </p>
        <p>
            <label for="Price">Price:</label>
            <%= Html.TextBox("Price") %>
            <%= Html.ValidationMessage("Price", "*") %>
        </p>
        <p>
            <label for="UnitStock">UnitStock:</label>
            <%= Html.TextBox("UnitStock") %>
            <%= Html.ValidationMessage("UnitStock", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>dasda

HTML elementinin özelliklerinden ValidationMessage() ile kullanıcıların veri girişinde yapmış oldukları hataları gösterebilmemize olanak tanımaktadır. Gerekli kontrolleri hatırlayacağınız üzere ProductController sınıfının içerisinde yer alan Create metodunun içerisinde yapılmıştı. Sizler index() metodunun dışında yer alan sayfaları da oluşturarak uygulamanızı daha da kullanışlı bir biçime getirebilmeniz mümkündür. Eğer bu işlemler esnasında herhangi bir zorluk yaşıyorsanız Asp.Net MVC Framework ile ilgili geçmiş yazıları okuyarak eksiklerinizi tamamlayabilirsiniz. Gerekli sayfaları oluşturduk ve web sayfasını çalıştırıyoruz.



Adres çubuğuna dikkat edersek, oluşturulan controller in adına göre view katmanına alt klasörler oluşturuldu ve o klasörün içerisinde oluşturulmuş olan index sayfası çağırıldı. Fakat tablomuzda hiç bir kayıt olmadığı için karşımıza sadece tablo alanlarının isimleri gelmektedir.



Gördüğünüz üzere ProductController sınıfında Create() metodunda kullanılacak değerler için eklemiş olduğumuz bütün Validation kontrolleri gerçekleşmiştir. Çok ufak bir hatırlatma yapmak gerekirse, Create() metodunda [Bind(Exclude="")] kullanım şekli veri tabanından ya da başka bir yerden otomatik olarak eklenecek olan verileri belirtmektedir. Bu bize belirtilen alan için değer bekleme eğer ki alan view sayfa üzerinde kaldırılmadıysa dahi girilen değeri görmeden işlemleri yapmaya devam et anlamına gelmektedir.

Yazımızda değinmiş olduğumuz konulara kısaca bir göz atmak gerekirse; İlk olarak Validation işlemlerinin hangi durumlarda, nasıl ve hangi amaçlarla kullanıldığını açıklamaya çalıştık. Bir sonraki adımımızda bir proje oluşturarak tablomuzu Entity Data model 'e ekleyerek proje içerisinde kullanılabilir bir duruma getirdikten sonra tablo için gerekli olan controller sınıf oluşturuldu. MVC Framework ile hazırlanmış olan web uygulamalarında Validation işlemlerini kullanmak istediğimizde Controller sınıflarının içerisinde yapmamız gerektiğini ve ModelState.AddModelError() özelliğini kullanmamız gerektiğine göz attık. Daha sonra oluşturmuş olduğumuz metodun view sayfasını nasıl oluşturabileceğimizi tekrardan hatırlayarak Create sayfasını oluşturduk. Markup kod tarafına otomatik olarak eklenen kodları incelediğimiz de gözümüze HTML elementinin bir başka özelliği çarpmaktadır ki bu özellik bizim uygulamak istediğimiz Validation işlemlerinde en çok yarayan '*' 'ı koymaktadır. HTML.ValidationMessage() özelliği ile de hatalı girilen bileşenlerin yanına kırmızı bir * koyarak daha da belirgin olabilmesine olanak tanımaktadır. En son olarak da yaptığımız işlemleri internet tarayıcında kontrol ederek işlemlerimizi tamamladık.

Umarım yararlı olabilmiştir.

Turhal Temizer
info@turhaltemizer.com

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.