mehmetduran.com - Paylaşmak Güzeldir...
Asp.net MVC'de View'lara Veri Taşıma (Aktarma) Yöntemleri
Bu yazımda MVC sisteminde View'lara yani sayfalarımıza veri aktarımını nasıl yapacağımızı açıklamaya çalışacağım. Özellikle MVC ile data kontollerine data yükleme veya her türden veriyi View'ımıza aktarma yöntemlerini göreceğiz. Verileri alma ve taşıma işlemlerini projemizin merkezi olan ve herşeyi kontrol etmemizi yarayan Controller bölümünde yapıyoruz. Controller bölümünde tanımladığımız metotlar ile verilerimizi alıp View'lara taşıyacağız. Taşıma işlemi için ViewData ve ViewModel yöntemlerini kullanmayı göreceğiz. Bu iki yöntem ile her türlü veriyi View'lara aktarabilmekteyiz. Şimdi bu yöntemleri kullanarak view'lara verileri taşımayı görelim.

Öncelikle en basit veri aktarım yöntemi ViewData nesnesini kullanarak yapılan aktarım. ViewData'ya her türden tanımlanmış olan değişkenleri, nesneleri gömebiliyoruz. Daha anlaşılır olması açısından bu nesneyi object türüne benzetebiliriz. ViewData'ya yüklediğimiz verileri ise View içerisinde hangi türe gömmüşsek o türe dönüştürerek kullanabiliyoruz. Daha iyi anlaşılması için aşağıdaki kodları inceleyebilirsiniz.

 
// En basit kullanım için Controller'daki View tanımlaması
public ActionResult Anasayfa()
{
  ViewData["icerik"] = "İçerik değerimizi ViewData ile string olarak taşıyoruz.";
  return View();
}
 
// Html bölümde verimizi istediğimiz yere yazdırıyoruz.
<%= ViewData["icerik"] %>
 
 
 
// Data kontrolüne veri yüklemek için Controller'daki View tanımlaması.
public ActionResult Anasayfa()
{
  DataTable tablo = new DataTable();
  /* burada veritabanından veya başka kaynaktan verileri datatable'a aktaracağız. */
  ViewData["veriler"] = tablo; // Verileri içeren DataTable nesnemizi ViewData'ya gömüyoruz.
  return View();
}
 
// Html bölümde ViewData ile çektiğimiz verileri herhangi bir data kontrole yüklüyoruz.
<% Repeater1.DataSource = (System.Data.DataTable)ViewData["veriler"]; Repeater1.DataBind(); %>
 
<asp:Repeater ID="Repeater1" runat="server"></asp:Repeater>
 

Görüldüğü gibi tüm verileri ViewData nesnesi ile taşıyıp View'ımızda kullanbiliyoruz. Özellikle veritabanı işlemlerinde verilerimizi DataTable gibi bir sınıftan oluşturduğumuz nesne tutup aktarım için bu nesneyi ViewData'ya gömüyoruz ve View'da tekrardan ViewData değerini DataTable türüne yani herhangi bir data kontrolüne yüklenebilit hale kesiyoruz ve yüklem işlemini yapıyoruz.

MVC'de en beğendiğim ve en çok kullanmaya çalıştığım veri aktarım yöntemlerden biri ise ViewModel yöntemi. Bu yöntem ile yazdığımız bir class'tan yani modelden oluşan bir View oluşturup bu yöntem ile verilerimizi aktarabiliyoruz. Ancak Model nesnesini kullanabilmek için yazdığımız modeli kullanacak olan View'ın Inherits özelliğini modelimize göre uyarlıyoruz. Bu şekilde uyarladıktan sonra Controller bölümünde yazdığımız modelden bir nesne oluşturup özelliklerine değerleri yükleyip ViewModel yöntemi ile View'ımıza yönlendiriyoruz. View'ımızda ise yazdığımız modelin özelliklerine yani verilere ise Model nesnesi ile ulaşıyoruz. Bu yöntemi ve yazdıklarımı anlamak için aşağıdaki kodlamaları inceleyebilirsiniz.

 
namespace mvc_proje.Controllers
{
  public class sayfa
  {
    public string sayfa_baslik { get; set; }
    public string sayfa_description { get; set; }
    public string sayfa_keywords { get; set; }
    public string sayfa_icerik { get; set; }
    public DataTable veriler { get; set; }
  }
 
  public class HomeController : Controller
  {
    public ActionResult Anasayfa()
    {
      // Burada veritabanından veya başka kaynaktan verileri alıp nesne oluşturduğumuz class'ın özelliklerine
      // atayacağız ve bu class'ı View'ımıza yönlendirerek verilerimizi taşımış olacağız. (ViewModel yöntemi)
      sayfa syf = new sayfa();
      syf.sayfa_baslik = "Sayfa Başığı.";
      syf.sayfa_description = "Sayfanın description meta tag değeri.";
      syf.sayfa_keywords = "Sayfanın keywords meta tag değeri.";
      syf.sayfa_icerik = "Sayfanın içeriği.";
      syf.veriler = new DataTable();
      return View(syf);
    }
  }
}
 
// View'ımızın html kodlama bölümünde ilk satırda bulunan Inherits özelliğini şu şekilde değiştiriyoruz.
// Inherits="System.Web.Mvc.ViewPage<mvc_proje.Controllers.sayfa>"
 
// İstediğimiz veriyi Model yöntemi ile alıp, kullanabiliyoruz.
<%= Model.sayfa_baslik %>
<%= Model.sayfa_description %>
<%= Model.sayfa_keywords %>
<%= Model.sayfa_icerik %>
 
// Html bölümde ViewModel ile çektiğimiz verileri herhangi bir data kontrole yüklüyoruz.
<% Repeater1.DataSource = Model.veriler; Repeater1.DataBind(); %>
 
<asp:Repeater ID="Repeater1" runat="server"></asp:Repeater>
 

Kodlamalarda oluşturduğum "sayfa" modeli ile View'larımızın içeriklerini çok rahat bir biçimde ViewModel yöntemi sayesinde doldurabiliriz. MVC'de en beğendiğim özelliklerden ve kullanılması en rahat olan yöntem. Örneğimin de oldukça anlaşılır olduğunu düşünüyorum.

Umarım yazdıklarım MVC ile ilgilenenlere özellikle son dönemde data kontrollerine veri aktarma hakkında soru soranlara yardımcı olur veya fikir verir.

İyi Çalışmalar.
Mehmet Duran 22 Temmuz Çarşamba 2009 24 42038 4,8
Bookmark and Share
Bu Yazıyı Değerlendirin.
Konuyla İlgili Olabilecek Diğer Yazılar C Sharp'ta Split Metodu Kullanımı Asp.net MVC Areas (Birden Fazla Proje Kullanarak) Asp.net MVC ile İlgili Birkaç Bilgi Asp.net MVC Areas (Tek Proje Kullanarak) C Sharp'ta Değişken Sayıda Parametre Alan Metot Oluşturma
Yorumlar
Yorum Yaz
RSS Yorum Takibi
Mazhar Kayaoğlu 22 Temmuz Çarşamba 2009 00:28 #1
Arkadaşım ne kadar teşekkür etsek azdır.Umarım hep beraber daha iyi yerlere geliriz.
Mehmet Duran 22 Temmuz Çarşamba 2009 00:33 #2
Ben de teşekkür ederim. Dileğine katılmamak mümkün değil. Ülke olarak, millet olarak en iyi yere geliriz. Benim de dileğim, isteğim, hedefim bu. Kolay gele.
cem kara 22 Temmuz Çarşamba 2009 15:42 #3
public ActionResult Index(int? sayfa) { }
yukarıda ki fonksiyonda gelen parametre int olmak zorunda mı yoksa string de olabilirmi. Bol MvC`li günler.
Mehmet Duran 22 Temmuz Çarşamba 2009 23:10 #4
Parametre orada string, int, object, var, vb.. olabilir. Ancak o değeri alıp kullanacağın yerde kullanman gereken türe çevirmen, dönüştürmen gerekir.
Ali Bereket 22 Temmuz Çarşamba 2009 23:34 #5
Arkadaşım paylaşmış olduğun özelleştirilebilir html.actionlink fonsksiyonu normal bir class ekleyip fonksiyonu oraya eklediğimde böyle bi hata veriyor. `System.Web.Mvc.HtmlHelper' does not contain a definition for 'ActionLink' and no extension method 'ActionLink' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?)
Mehmet Duran 22 Temmuz Çarşamba 2009 23:45 #6
Aldığın hatanın nedeni tanımladığın Class`ı System.Web.Mvc namespace'i altında tanımlamamış olman. Eğer bu namespace altında tanımlarsan sorun çözülür. Ancak bunun yanı sıra yazmış olduğun namespace'i de kullanabilirsin. Bunun için öncelikle yazdığın namespace'i sayfaya import ederek bildirmen gerekir. Ardından ActionLink'i oluşturuken Html.metot_adi(...) şeklinde çağırabilirsin.
Ali KARTEPE 22 Temmuz Çarşamba 2009 23:58 #7
public ActionResult haber( int haber_id)
Dostum yukarıda ki actionı çağıran şöyle bir url olduğunda (..ana/baslik/haber/100)sonda ki ID değerini fonksiyonum otomatik olarak alır mı?İyi geceler.
Mehmet Duran 23 Temmuz Perşembe 2009 00:04 #8
Merhaba. Tanımladığınız Route yapısında elde etmek istediğiniz id olmalı ya da başka bir biçimde söyleyecek olursak id değerini elde edebilecek bir Route tanımlaması yapılması gerekir. Buradaki MVC ile ilgili yazımda ikinci kod bölümünde bununla ilgili örneği görebilirsin.
Ali KARTEPE 23 Temmuz Perşembe 2009 09:10 #9
hocam dediğin bölüme baktım orda global.asax da iki tane maproutes var global.asax da bir fazla maproutes tanımlayabiliyormuyuz.Ayrıca bu maprotes yapısı ile özel oluşturduğumuz html.link yapısı aynı olması gerekiyor değil mi? İyi çalışmalar.
Mehmet Duran 23 Temmuz Perşembe 2009 09:17 #10
Routes tanımlamasını istediğimiz kadar yapabilmekteyiz. Ancak link oluştururken oluşturduğumuz tanımladığımız routes`lardan birine uygun olması yeterli. Yani her view'ı çalıştırmak için ayrı ayrı route oluşturabilir ve ona göre link verebiliriz veya tanımladığımız genel bir route ile tüm view çalıştırma işlemlerini ve link işlemlerini gerçekleştirebiliriz.
sinan özkan 23 Temmuz Perşembe 2009 09:25 #11
saolasın mehmet sayende mvc öğreniyoruz başka kaynaklardan pek anlaşılmıyor devamını bekliyoruz
Mazhar KAYAOĞLU 24 Temmuz Cuma 2009 09:30 #12
Hocam mvc de datalist veya herhangi bir data kontrolünün rowcommand veya diğer olaylarını nasıl çalıştırabiliriz.Paylaşımlar için teşekkürler.Kolay gelsin.
Mehmet Duran 24 Temmuz Cuma 2009 13:06 #13
MVC'de View sayfasında data kontrollerinin eventlarına erişmek için tıpkı Asp.net'te olduğu gibi View'ın codebehind tarafını oluşturabilir ve burada yapmak istenilen işlemleri yapabilirsin. Partial class türünde ViewPage sınıfını inherit eden bir sınıf tanımlayıp kullanacağın View'ın Inherit özelliğine kendi yazdığın class'ı atamalısın. Daha sonra kod tarafında Asp.net'teki kodları olduğu gibi çalıştırabilirsin. Ancak MVC'de script kolaylığı ve nesne kolaylığı bu tür işlemlerin olmamasını gerektirir diye düşünüyorum.
Enes Aydın 24 Temmuz Cuma 2009 14:27 #14
Programımda 2 dropdownlis'im var...1.cisini otomatik dolduruyorum seçim yapmadan fakat ikinci dropdownlist'im 1.ci de seçilen index'e göre gelmesini sağlamak istiyorum nasıl yapabilirim mvc de bunu bir türlü çözemedim..
Mehmet Duran 24 Temmuz Cuma 2009 22:33 #15
Merhaba. Bunun için ilk drop'u seçtikten sonra sayfayı post action'ı kontrol eden metoda yönlendirebilir ve bu metotta gelen değere göre verileri çekip ikinci drop'u doldurabilirsin. Ancak ikinci drop'u doldurma esnasında ilk dropun aktif elemanının yok olmaması için ikinci dropu doldurduğun metotta birinci drop'u ve aktif elemanı da kontrol etmelisin. Bu yöntem sayfayı post ederek yapılacak olan işlem. Bunun dışında Ajax ile daha basit yapılabilir. Yönetim panelinde bu şekilde işlemler yapmaktayım. Ajax kullanmanı tavsiye ederim. Son olarak View için tanımlayacağın codebehind ile Asp.net'teki kodları olduğu gibi kullanabilirsin.
Enes Aydın 27 Temmuz Pazartesi 2009 10:52 #16
Merhaba.Demek istediğinizi anladım teşkkürler.1 sorum daha olacak.sayfam acildiginde birinci dropdwnlistim dolu olarak geliyor ama secim yapamıyorum neyi secersem seçeyim post edilip tekrar baştan yükleniyor ve 1. item seçilmiş gözüküyor.Ne yapmam gerekir?Bide seçtiğim item'in value değerini de seçildikten sonra Url'ye aktarmak istiyorum.mesela---localhost...Home.aspx değil de localhost...Home/4 olsun.
Mehmet Duran 27 Temmuz Pazartesi 2009 23:52 #17
Bir önceki yorumumda zaten bunu belirtmiştim. Seçilen değere göre dropta selected elemanı da kontrol etmen gerekir. Aksi halde her işlemde yeniden yükleme olur. Yönlendirme işlemi için Controller tarafında return RedirectionAction özelliğini kullanabilirsin veya javascript ile de halledebilirsin. Ancak bana göre bu işlemi tamamen Ajax ile yapmak daha mantıklı olur. Ajax ile bu problemlerin hiçbiri olmaz.
Ahmet GÜNEY 05 Mayıs Çarşamba 2010 21:47 #18
Sevgili kardeşim yukarıdan anlattığın model yöntemi ile bişeyler yapmaya çalıştım.Ama başarısız oldum.Sorum şu sınıfımda oluşturduğum "List" elamanına erişmeye çalıştığımda hiçbir şekilde sonuçlar ekrana yansımıyor.Herşey çalışıyor.Hata falanda vermiyor.Ama list elemanımın hiçbir değeri ekrana yansımıyor.(foreach kullanarak list elemanı içinde ki verilere ulaşmaya çalışıyorum ) Böyle bir sorunla karşılaştınmı yada bu soruna karşı yardımcı olurmusun.Kolay gelsin.
Mehmet Duran 07 Mayıs Cuma 2010 01:10 #19
Merhaba. Eğer List yapısına verileri doğru biçimde yüklemiş ve bu verileri View tarafına (ViewData vb. ile) aktarıp, List yapısına kestiğinde döngüde hata vermiyor ve hiçbir veri listelenmiyorsa ya List yapısı boş geliyordur ya da listelemede sorun vardır. Bunun için kodları görmek daha iyi olacaktır.
Barış Geçer 18 Haziran Cuma 2010 20:14 #20
Çok güzel bir örnek olmuş.Asp.net/mvc'deki örnekte bu olayı anlayamamıştım ama burada Türkçe olmasının da katkısıyla çok güzel anladım.Teşekkürler.
Mazhar Kayaoğlu 21 Haziran Pazartesi 2010 16:58 #21
Kardeşim mezuniyetin hayırlı olsun. Sorum şu usercontrolü .net gibi aynen mvc de kullanabiliyormuyuz. yani override onload deyip doldurabiliyormuyuz. ayrıca mvc usercontrolde View'lara veri taşıma olayı varmı yada nasıl bir yapı kullanılır.
Mehmet Duran 22 Haziran Salı 2010 00:26 #22
Daha önce paylaşmış olduğum kodlar aynen MVC'de de kullanılabilir. Ancak o kodlar yerine direk olarak MVC UserControl kullanılıyor ise PartialView ile de UserControl'leri render edebilir ve sonucu elde edebilirsin. UserController'de MVC'deki gibi bir veri aktarma olayı yerine direk olarak page_load event'ında veya onload event'ında gerekli nesneleri oluşturup, veritabanına bağlanıp verileri alabilirsin.
Serdar Toprak 26 Haziran Cumartesi 2010 12:48 #23
Arkadaşım paylaşımların çok iyi çok yardımcı oluyor.ViewModel yöntemi ile veri taşımayı asp.net tarafında nasıl yapabiliriz.Yardımcı olursan sevinirim. Ben yaptım ama "null" hatası veriyor.İyi çalışmalar.
Mehmet Duran 26 Haziran Cumartesi 2010 13:00 #24
Merhaba. ViewModel yöntemi MVC ile gelen bir yöntem ve MVC içinde veri aktarma yöntemlerinden birisi. Eğer MVC değil de Webforms ile çalışıyorsan bu yöntemi kullanman gerekmez. Direk olarak kullanmak istediğin verileri uygun değişkenlere atayarak değişkenler ile kullanabilirsin.
İsim :
Site :
Yorum :

Buradan bu yazıya ait yorumları RSS olarak takip edebilirsiniz.

Bu servis ile yazılara eklenen yorumları RSS ile takip ederek konu ile ilgili başkaları tarafından yapılan yorumları veya konuyla ilgili sorduğunuz sorulara verilen cevapları görebilirsiniz.
Ne edersen kendine, edersin kendi kendine.
Bölümler
Yazılar
Arşiv
Arama
Linkler
Site İçi Arama
Son Zamanlarda Ne Yapıyorum ?
İstatistikler - Araçlar - Reklam
İstatistikler
Sayaç
Mehmet Duran | mehmetduran.com | Copyright © 2009