Asp.net MVC ActionName Attribute

21 Ağu

ActionName attribute bir action metodunun farklı isimlerle adlandırılmasını sağlar. Bu işlem iki farklı yolla yapılır.

Birinci yöntem olarak overload edilmiş, yani aynı isimdeki iki metodu birbirinden ayırmak için kullanabiliriz. Örneğin Product controller Details() adında iki metoda sahip olsun. İlk Details() metodu integer tipinde id parametresi alıyor olsun. İkinci Details() metodu parametre almasın. Bu durumda iki metodu birbirinden ayırmak için ActionName attribute kullanılabilir.

İkinci yöntem olarak ise farklı isimdeki metodları aynı isimle çağırmak isteyebiliriz. Yani ilk yöntemin tam tersi bir durum olabilir.


[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit_GET(Merchandise merchandiseToEdit)
{
     return View(merchandiseToEdit);
}

// POST: /Merchandise/Edit

[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit_POST(Merchandise merchandiseToEdit)
{
     try {
           return RedirectToAction(“Edit”);
         }
     catch
         {
           return View();
         }
}

Dikkat: Bir sınıf içinde aynı isimde ve aynı parametreyi alan iki metod bulunamaz. Ancak aynı isimde ve aynı parametre alan iki action olabilir.

Örnekte gördüğümüz gibi iki Edit() metodundan biri HTTP GET operasyonu, diğeri ise HTTP POST operasyonu tarafından çağrılıyor.


		

ViewData kavramı ve ViewModel Deseni

19 Ağu

ViewData yardımıyla Controller tarafından View tarafına veri geçirme işlemi

Bu yazımızda mvc ortamında kullanılan ViewModel deseni üzerinde duracağız. View katmanına Controller sınıfından ViewData, TempData, ViewBag gibi nesneler yardımıyla veri geçirebilmekteyiz. Örneğin bir dropdodwnlist bileşeninin içeriğini taşıyan kolleksiyon nesnesi bu yapılar vasıtasıyla View sayfasına taşınabilmektedir. Örneklendirmeyi NerdDinner uygulaması üzerinden yapılmaktadır.

Controller Tarafı:

public ActionResult Edit(int id) {

Dinner dinner = dinnerRepository.GetDinner(id);

ViewData[“Countries”] = new SelectList(PhoneValidator.Countries,

dinner.Country);

return View(dinner);

}

View Tarafı:

Html.DropDownList(“Country”, ViewData[“Countries”] as SelectList)

Yukarıda görüldüğü gibi ViewData nesnesi Country listesini view tarafına taşımaktadır.

ViewModel Deseni

Yukarıda bahsettiğimiz şekilde conroller sınıfından view şablonuna veri geçirmek kısa vadede pratik ve hızlı bir çözümdür. Küçük projelerde kullanılabilecek iyi bir yöntem olarak görülebilir. Fakat bu yöntemin uzun vadede bazı dezavantajları vardır. Bunlardan biri geliştirici string tabanlı bir yazım yöntemi kullandığı için (ViewData[“Countries”]) herhangi bir yazım yanlışında derleme zanında hata yakalanamayacaktır. Bir diğer dezavantaj ise ViewData nesnesinin bir SelectList tipine çevrilrme gereği duyulmasıdır.

Bu dezavantajlara alternatif olarak sunulan bir çözüm ise VievModel deseninin kullanılmasıdır. Yani View şablonunda ihtiyaç duyulacak bileşenlere göre bir sınıf oluşturularak Strongly-typed yöntemi ile View sayfası bu sınıftan üretilir. View sayfasında kullanacağımız dropdown gibi bileşenler için SelectList nesneleri yazdığımız sınıf içine tanımlanır. Controller sınıfı yardımıyla optimize edilmiş ViewModel sınıfı Viewtarafına sunulmuş olur.

public class DinnerFormViewModel {

// Properties

public Dinner Dinner { get; private set; }

public SelectList Countries { get; private set; }

// Constructor

public DinnerFormViewModel(Dinner dinner) {

Dinner = dinner;

Countries = new SelectList(PhoneValidator.Countries,

dinner.Country);

}

}

Yukarıda Nerddinner projesinden bir ViewModel örneği gösterilmiştir. Yani view şablonunda Dinner nesnesi ve country listesini tutacak birde SelectList nesnesi oluşturulmuştur.

Güncelleme işlemi için action metodlarını aşağıdaki gibi tanımlayabiliriz.

[Authorize]

public ActionResult Edit(int id)
{

Dinner dinner = dinnerRepository.GetDinner(id);

return View(new DinnerFormViewModel(dinner));

}

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult Edit(int id, FormCollection collection) {

Dinner dinner = dinnerRepository.GetDinner(id);
try {

UpdateModel(dinner, “Dinner”);

dinnerRepository.Save();

return RedirectToAction(“Details”, new { id=dinner.DinnerID });

}

catch {

ModelState.AddModelErrors(dinner.GetRuleViolations());

return View(new DinnerFormViewModel(dinner));

}

}

Dikkat 1

Bu noktada dikkat etmemiz gereken önemli bir nokta: View sayfasının DinnerFormViewModel sınıfından türemiştir.

Dikkat 2

Eğer view sayfası Dinner sınıfından türetilseydi UpdateModel() metodu şu şekilde olacaktı.

UpdateModel(dinner);

Ancak DinnerFormViewModel sınıfından türetildiği için şu şekilde olmuştur.

UpdateModel(dinner, “Dinner”);

Asp.net app_offline.htm dosyası Site Bakımda uyarısı

7 Ağu

Asp.net 2.0 ile birlikte gelen yeniliklerden bir taneside sunucuda çalışan uygulamalarımızı offline hale getirebileceğimiz özellik.

Web uygulamamızın kök dizinine app_offline.htm adında bir dosya bıraktığımızda Asp.net uygulamamızı kapatacaktır.

Artık uygulamamızın hiçbir sayfasına erişmek mümkün değildir. Sitemize gelen istekler direk app_offline.htm sayfasına yönlendirilecektir. app_offline.htm sayfasına sitenin kapalı olmasının sebebini bildirecek mesajlar verebiliriz. “Sitemiz geçici olarak bakıma alınmıştır.” gibi.

Bu yöntem uygulammızda köklü değişiklikler yaparken veya uygulamamızın çalışmasını etkileyecek küçük değişiklikler yaparken faydalı olacaktır.

Yapılan değişiklikler bittikten sonra app_offline.htm dosyasını kaldırdığımızda Asp.net uygulamamızı tekrar başlatacak ve uygulamamız yeni haliyle kaldığı yerden yoluna devam edecektir.

İpucu: You have mixed tabs and spaces uyarısı

7 Ağu

Productivity Power Tools eklentisi yüklü olan arkadaşlar farketmişlerdir ki Visual Studio ortamında kod geliştiriken bezen aşağıda resimde göründüğü gibi bir uyarı çubuğu belirir. Uyarı: “You have mixed tabs and spaces” şeklindedir.

Bu uyarı genelde açılan tab sayısı arttıkça ortaya çıkmaktadır. Bu uyarının çıkmasını istemiyorsak şu ayarı yapmamız gerekiyor. Tools -> Options -> Listeden Productivity Power Tools seçerek Fix Mixed Tabs seçeneğini Off durumuna getiriyoruz.

İpucu – Web projesini yayınlarken boş dizinleri de dahil etme

5 Ağu

Bugün ASP.NET MVC 3 projemi IIS7 ortamında yayınlamak istedim. Projeya sağ tıklayıp publish seçeneğini seçerek açılan pencerede gerekli alanları doldurdum ve devam ettim. Inetpub – wwwroot içerisinde projem yayınlanmıştı ve kullanıma hazırdı. Ancak projeye kullanıcıların yüklediği dosyaları tutmak için açtığım Uploads dizini wwwroot içersine yüklenmemişti. Deploy aracı boş dizinleri atlamış yayınlamamıştı.

“Bu boş dizinler nasıl yüklenecek?” sorusunu kendi kendime sordum bir süre. Çözüm boş dizinler içersine yeni bir dosya eklemekti.

Yani sunucu ortamınada yayınlamak istediğim Uploads dizininin içine bir index.html yada herhangi bir dosya ekleyip yayınla dediğimde Uploads dizini de wwwroot içine başarılı bir şekilde yayınlanmıştı.

ASP.Net MVC 3 Giriş Projesi

5 Ağu

Giriş

Visual studio development ortamını çalıştırarak işe başlıyoruz. Sürümümüz Web Developer 2010 Express olacak.

Visual studio açıldıktan sonra Start Page sayfasında New Project linkine tıklayarak yeni proje oluşturmaya başlıyoruz. Yeni proje oluşturmak için bir diğer yol ise File > New Project menüsünü tap etmektir.

İlk uygulammız

Uygulamamızı Visual Basic veya C# dillerinden birini seçerek geliştirebiliriz. Biz uygulamamızda C# dilini seçerek geliştiriyor olacağız. Visual C# sekmesini tıklayıp ASP.NET MVC 3 Web Application proje tipini  seçerek devam ediyoruz. Aynı pencere üzerinde Name, Location ve Solution Name alanları isteğe göre doldurulabilir. Proje adını “MvcMovie” olarak düzenliyor ve devam ediyoruz.


OK butonunu tıkladığımızda karşımıza aşağıdaki gibi bir pencere açılacak. New ASP.NET MVC 3 Project penceresinde template olarak Internet Application seçiyoruz, view engine olarak Razor ve Use HTML5 markup kutusunu işaretliyoruz.


OK butonuna bastığımızda Visual Web Developer Asp.net MVC projemizi varsayılan olarak ayarlayıp karşımıza getiriyor. Şu anda çalıştırılmaya hazır bir proje karşımızda duruyor.

Herhangi bir değişiklik yapmadan projeyi çalıştıralım. Debug menüsünden Start Debugging seçimini yapıyoruz. Menüde gördüğünüz gibi klavye kısayolları belirtilmiş. F5 kısayolu Debug > Start Debuging menüsünü işaret ediyor.

Visual Web Developer web tarayıcısını başlatıyor ve uygulamanın giriş sayfası açılıyor. Adres çubuğunda siteadi.com yerine localhost gözüküyor. Localhost kendi bilgisayarınızı işaret etmektedir. Visual Web Developer her çalıştığında web server tarafından rastgele bir post numarası kullanır. Aşağıdaki resimde göründüğü gibi port numarası 43246’dır.

Bu uygulamada varsayılan olarak tanımlanmış iki sayfa ve birde basit login formu mevcuttur. İlerleyen yazılarımızda uygulamanın nasıl çalıştığı konusuna değinmeye çalışacağız.

Kaynak: http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs

Asp.Net MVC Tarihi Gelişimi

5 Ağu

Bu yazıda Asp.net MVC’nin gelişimi sürecine değinmeye çalışacağız. Zamanla değişen ve gelişen özelliklerine versiyonlar halinde değiniyor olacağız.

Asp.net MVC resmi olarak 3 ana versiyon ve  1 update tool halinde yayınlanmıştır.

Asp.Net MVC 1.0

MVC’nin ilk resmi yayın tarihi 2009 yılı olmuştur. Bünyesinde barındırdığı ve günümüze kadar gelen en temel özellikleriyle piyasaya sürülmüştür. Bu özellikler aşağıdaki gibi sıralayabiliriz.

  • Mvc  yapısı, kendine özgü bir yaşam döngüsü, gelen isteklerin(request) cevaplanması (Controller katmanı) ve sonucun çıktı halinde kullanıcıya sunulması(View katmanı).
  • Routing kavramı.
  • HTML etiketlerini oluşturmayı sağlayan helper kavramı.
  • Ajax tabanlı linkler ve formlar.
  • Post edilen formların bilgilerini otomatik olarak .Net nesnelerine bağlayan Model Binder ve modele ait doğrulamaları yapan Model Validation kavramı.

Bu web alanında atılan büyük bir adımdı. Fakat kurumsal ve büyük çaplı projeler için altyapının biraz daha geliştirilmesi gerekiyordu. Neyse ki Asp.net MVC Microsoft cephesinin ilk genişletilebilir ürünüydü. Çoğu temel bileşen genişletilebilir hatta tamamen kendi oluşturacağınız yapılarla değiştirilebilir esnekliğe sahiptir. Örneğin DefaultModelBinder yeterli esnekliğe sahip değilse kendi özel Model Binder sınıfımızı geliştirebiliriz.

Asp.net MVC 2.0

2010 yılında yeni sürüm olan 2.0 sürümü yayınlandı. Bu sürümde verimliliği arttırmak ve büyük uygulamalarda bakımı ve gliştirilebilirliği kolaylaştırmak amaçlanıyordu. Yeni eklenen özellikler:

  • Server ve client tarafında attribute tabanlı Model validation.
  • Büyük uygulamara için uygulama içinde başka bir uygulama  tanımlayabilen Area kavramı.
  • Model ve attribute tabanlı olacak şekilde form ve view sayfalarını otomatik oluşturulabilen Html Templated Helpers.
  • Asenkron Controller.
  • Lambda tabanlı Html Helper.

Bu versiyonda birkaç özellik önceki versiyondaki mevcut olanlara ek olarak tanıtıldı. Bunlar:

  • Model Metadata Provider ve  Model Validation Provider.
  • Validation Attribute ve validation mantığı.
  • Custom teplates.

Asp.net MVC 3.0

2011 yılında yayınlanan bu sürümde framework üzerinde köklü bir değişkliğer gidilmedi. Sadece süsleme tarzında kullanım kolylıkları sunan birtakım düzenlemeler yapıldı. MVC3 yenilikleri şu şekilde sıralayabiliriz.

  • Visual Studio içersine dahil edilen MvcScaffolding sayesinde CRUD(Create Read Updare Delete) işlemlerini yapacak Controller ve bu metodları kullanacak View sayfaları model bazlı olarak otomatik oluşturulabiliyor.
  • JQuery, JQuery UI gibi javascript kütüphaneleri projelere otomatik dahil ediliyor ve NuGet paketleri sayesinde anında güncellenebiliyor.
  • Entity Framework Code First varsayılan data access kütüphanesi olarak sunuluyor.
  • HTML 5 desteği.
  • Razor view engine.

Tahmin

Bundan sonraki sürümde tahminimce HTML5 destekli view engine geliştirmesi yapılacak. Entity Framework code first yaklaşımı ile aktif hale gelen MvcScaffolding motoru şu anda CRUD işlemlerini direk Controller içerisinde yapıyor. Bu yüzden Repository patterne uyumsuzluk söz konusu. Bunun düzeltilerek repository patterne uyumlu hale getirileceği yine tahminlerim arasında.

 

Kaynak: http://codeclimber.net.nz/archive/2011/06/29/The-history-of-ASP-NET-MVC-so-far.aspx

 

Windows 7 IIS 7 yükleme sorunu

5 Ağu

Merhaba arkadaşlar,

     Bugünlerde beni sıkıntıya sokan bir durumu ve bu sorunun çözümünü paylaşmak istiyorum.  Windows 7 Proffessional sürümü üzerinde IIS7 yüklemeye karar verdim. Denetim masası (Control Panel) > Programlar ve özellikleri (Programs and Features) yolunu takip ederek Windows özelliklerini aç veya kapat linkini tıkladım ve açılan pencerede Internet Information Services düğümünü açarak IIS’in çalışması için gerekli seçimleri yaptım ve Tamam butonuna tıkladığımda birde ne göreyim! Aşağıdaki hata penceresi aniden karşıma dikildi.

 

Hata mesajı “Bir hata oluştu. özelliklerin tümü başarıyla değiştirilemedi” ( An error has occurred. Not all of the features were successfully changed ) şeklindeydi. Hatayı yok edebilmek için çeşitli varyasyonlar denedim ama nafile. Hiçbir sonuç alamamıştım. Son çare olarak windows service packs 1 yüklemesini yapmak ve sonuç alamdığım taktirde ise sistemi yeniden kurmayı göze almıştım. Service pack yüklemesini başarılı bir şekilde bitrdim. Yüklemenin biraz uzun sürdüğünü söylemeden geçemeyeceğim. Sistemi yeniden başlattım ve aynı yolları izleyerek IIS 7’yi yüklemek için seçimleri yapıp Tamam(OK) butonuna bastım ve gözümü kapattım. Evet o gıcık gonk sesini duymamıştım ve yükleme başarıl bir şekilde tamamlanmıştı.

Aynı hatayla karşılaşan arkadaşlar için sorunun çözümlerinden biri service packs 1 yüklemektir.

Afrikalı çaresiz küçük kız

29 Tem

Birkaç kilometre ilerdeki yardım kampına ulaşmak isteyen fakat açlıktan adım atacak hali kalmamış ve çaresizce yere kapanmış küçük bir kız. Hemen arkasında bekleyen fırsatçı bir akbaba.

Yaşam  ile ölüm arasındaki o ince çizginin görünür hale geldiği anda bir insan belirdi küçük kızın yanında ve fotoğraf makinasıyla o anı dondurdu. K. Carter 1994 yılında çektiği bu fotoğrafla hayalindeki Pulitzer ödülünü kazandı.

Olayın devamında Carter’e küçük kıza ne olduğunu soruldu. Olayın devamı en az bu fotoğraf karesi kadar içler acısıydı. K. Carter küçük kıza yardım etmediğini fakat akbabanın korkarak oradan uzaklaştığını, kızın yaşayıp yaşamadığını bilmediğini söyledi. Neden yardım etmedin sorusuna ise “Yardım ekibinden değildim. Fotoğrafçıydım” cevabını verdi.

Bu olayın ardında K.Carter 1994’ün bir haziran günü intihar ederek yaşamına son verdi.