mehmetduran.com - Paylaşmak Güzeldir...
Asp.net MVC'de Kullanıcı Kontrolü (User Control) Kullanımı
Bu yazımda MVC ile kullanıcı kontrollerini (user control) hem MVC'nin kendi metodu ile hem de Ajax ile kullanmayı göstermeye çalışacağım. MVC ile Html sınıfının altında gelen RenderPartial metodu ile user controlleri çalıştırıp ekrana çıktısını getirebiliyoruz. Bu şekilde sayfalarımızdaki bölümleri user control ile oluşturabilir ve esneklik sağlayabiliriz. Ancak MVC'de bu şekilde bir kullanım için kullanacağımız user controlün System.Web.Mvc.ViewUserControl sınıfından türemesi gerekli. Bu kullanım dışında en kullanışlı yöntemlerden biri de User controlleri Ajax ile beraber kullanmak. Bu şekilde de herhangi bir user controlü Server.Execute metodu ile çalıştırıp, çıktısını string olarak elde edeceğiz. Bunun sonucunda da Ajax ile etkileşimli oldukça güzel birçok uygulama geliştirebiliriz. Şimdi bu kullanımlara göz atalım.

Öncelikle ilk kullanım olan ve MVC ile hazır olarak gelen Html sınıfı altındaki RenderPartial metodu ile kullanıma bakalım. Bu şekilde bir kullanım için html bölümde şu şekilde bir kullanım yapmalıyız.

 
<% Html.RenderPartial("~/Views/Home/usercontrol.ascx"); %>
 

Görüldüğü gibi metodumuz parametre olarak kontrolün adresini ile adını beraber almakta. Çalıştıktan sonra ise user controlün çıktısını string olarak ekrana yazdırmakta. Burada kullanacağımız user control System.Web.Mvc.ViewUserControl sınıfından türemeli. Bu şekilde sayfalarımızdaki bölümleri user controller ile rahatlıkla oluşturabiliriz.

Bu kullanım dışında çok kullanışlı bir yöntem ise user controlleri Ajax işlemlerinde kullanmak. Bu şekilde çok efektif, dinamik uygulamalar geliştirebiliriz. Bu yöntemde user control System.Web.Mvc.ViewUserControl sınıfından türeyebileceği gibi System.Web.UI.UserControl sınıfından da türeyebilir. Oluşturduğumuz kontrolü Ajax isteğinde bulunacağımız Controller metodunda Server.Execute metodu ile çalıştırıp çıktısını string olarak elde edeceğiz ve bu değeri Ajax isteğinin sonucu olarak (Json türünde) döndereceğiz. Örnek script ve controllerdaki metot kodları şu şekilde olmalı.

 
// Ajax ile usercontrol'ü çağıracağımız sayfada yazacağımız script kodlar.
<script>
    $(function(){
        user_control_getir();
    });
    function user_control_getir() {
        $.ajax({
            type: "post",
            url: "<%= Url.Action("user_control_oku", "Home") %>",
            data: "{}",
            dataType: "json",
            success: function(msg) {
                $("#sonuc").html(msg);
            },
            error: function(msg) {
                $("#sonuc").html("Hata Oluştu.");
            }
        });
    }
</script>
 
 
// Ajax ile istekte bulunacağımız UserControlü çalıştırarak
//string olarak getiren Controller metodumuz.
public ActionResult user_control_oku()
{
  Page page = new Page();
  UserControl ctl = (UserControl)page.LoadControl("~/Views/Home/usercontrol.ascx");
  page.Controls.Add(ctl);
  StringWriter writer = new StringWriter();
  HttpContext.Server.Execute(page, writer, false);
  string sonuc = writer.ToString();
  return Json(sonuc);
}
 

Ajax ile user control kullanarak çok kullanışlı uygulamalar geliştirebiliriz. Bu konuda düşündüğüm uygulamaları fırsat buldukça hayata geçirmeye çalışacağım. Ayrıca MVC bloğum için hazırladığım Ajax Uygulamalarım (demo olarak görebilirsiniz) bölümünü tamamen bu yöntem ile geliştirdim.

Ajax işlemlerinde user controle parametreler göndererek çok daha farklı, etkileşimli uygulamalar geliştirelebilir. Ayrıca yazmış olduğumuz user control'ü çalıştıran kodları bir metot olarak hazırlayıp bu metoda usercontrol adını parametre ile göndererek kullanmak daha kolay ve esnek olacaktır.

Daha önce Asp.net ve Ajax ile kullanıcı kontrollerini kullanmak için yazmış olduğum yazı da buradaki Ajax kullanımı ile aynı. Tek fark user controlü çalıştıracak olanın webmethod değil de Controller'daki metot olması. MVC ile ve Ajax işlemleri ile ilgilenen herkese çok kolaylık sağlayacağını düşünüyorum. Örnek verecek olursak bana çok kolaylıklar sağlıyor.

Umarım ilgilenenlere faydalı olur.
İyi çalışmalar.
Bookmark and Share
Bu Yazıyı Değerlendirin.
Konuyla İlgili Olabilecek Diğer Yazılar Jquery ile Yatay Accordion Uygulaması Host Değişimi Jquery ile Değişir Alan Yapımı (Güncelleme) Asp.net'te Generic Handler ile Ajax İşlemleri Asp.net'te Kendi Kontrollerimizi Oluşturmak
Yorumlar
Yorum Yaz
RSS Yorum Takibi
Serdar Durbarış 03 Kasım Salı 2009 12:26 #1
Mehmet merhaba vermiş olduğun bilgilr için teşekkürler çok işime yaradı fakat bir sıkıntı var db ye bianry olarak eklediğim verileri geri nasıl çekicem. projemde repeater kullanıyorum ve ürünlerle ilgili resimleri urunresim/+Eval("resim") şeklinde çekiyorum. peki binary resimleri nasıl çekicem? yardımcı olursan sevinirim
Mehmet Duran 03 Kasım Salı 2009 13:54 #2
Bunun için generic handler (.ashx) kullanabilirsin. Bu konuda netten örnek bulabilirsin. Daha önce bu şekilde bir kullanım yaptım ama şu anda paylaşma fırsatım yok. Generic handler'a gerekli bilgiyi bir şekilde iletip, o bilgiye göre gerekli binary veriyi alıp, response.binarywrite metodu ile sorunu çözebilirsin. (örneğin resmin linki şöyle olsun: href="image.ashx?fileID=deneme" buna göre ashx file içinde uygun veriyi çekip, dediğim metot ile binary veriyi yazdırabilirsin.)
Ozge 04 Kasım Çarşamba 2009 09:41 #3
Merhaba Mehmet bey öncelikle makale için çok teşekkürler.Bende benzer şekilde bir kullanım yaptım fakat benim çağırdığım usercontrol içinde Html.ActionLink(..)bulunması gerekiyor sorunda burada çıkıyor. Değer null olamaz. Parametre adı: viewContext hatası alıyorum Html algılanamıyor('Html' threw an exception of type 'System.ArgumentNullException') neden kaynaklanıyor olabilir acaba? Araştırdım ama benzer birşeye rastlayamadım.Yardımcı olabilirseniz sevinirim şimdiden çok teşekkürler
Mehmet Duran 05 Kasım Perşembe 2009 18:46 #4
Merhaba. Asp.net user control'ünde MVC ile gelen özellikleri kullanmak için System.Web.Mvc kütüphanesini kullanmalısınız. Örneğin Link için kulllanılan metotlara System.Web.Mvc.Html.LinkExtensions diyerek erişebilirsiniz. Ayrıca bunları hazır kullanmak yerine kendiniz de hazırlayabilirsiniz.
Ozge 06 Kasım Cuma 2009 13:39 #5
Sorun kutuphaneye erisimde degil erisimde problem yok ama run edilip ardindan controllerdan HttpContext.Server.Execute(page, writer, false); execute etmeye calistigimda sayfaya(usercontrol) dogrudan yazidigim veriler gorunuyor fakat html.actionlink vb bir kullanim oldugunda ArgumentNullException hatasi veriyor. OR: <%= Html.Encode(customer.name)%> calismiyor <%-- <%= customer.name%>--%> calisiyor
Mehmet Duran 06 Kasım Cuma 2009 19:17 #6
User control'de direk olarak Html.Actionlink kullanılmaz. Bunun için user controlün kod kısmında System.Web.Mvc altında bulunan Viewpage sınıfından public bir nesne oluşturup (public Viewpage vw; Bunu da user control'ün page_Load'u içinde yaratmak gerekiyor.), bu nesne üzerinden gerekli metotlara erişebilirsin. (vw.Html.ActionLink(...) gibi.)
İsrafil Şimşek 04 Nisan Pazar 2010 00:25 #7
Mehmet Bey öncelikle elinize sağlık güzel bir paylaşım olmuş. Benim sorum bahsettiğiniz gibi yaptığımda Controller içinde ki fonksiyonumdan ViewData içine atmış olduğum değerleri user control içinde kullanamıyorum. Hata alıyorum.
Mehmet Duran 04 Nisan Pazar 2010 00:41 #8
Merhaba. Controller içinde ViewData nesnesi ile taşınan verileri Controller'u tanımladığınız View içinde kullanabiliriz. Burada yapılan işlem sadece UserControl'ü render edip, sonucunun string olarak almak. Burada UserControl'e aktarmak istediğin değerleri UserControl'ün Attributes özelliği ile yapabilirsin. Buradaki yazımda paylaştığım kodlar bu konuda yardımcı olacaktır.
İ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