Asp.net Mvc Bir Sayfada Partial View Render Etme

Merhabalar. Bu yazımda mvc projemizde herhangi bir cshtml view sayfamızdan partial view çağırmayı ve bu sayfada nasıl render edildiğini anlatacağım.

Görüntülemek istediğimiz bir view sayfasında partial viewlar kullanmak isteyebiliriz. Sayfada görüntülemek istediğimiz her şeyi tek bir controller actionda yüklemek yerine küçük partial sayfalara ayırmak işimizi daha kolaylaştırır ve de daha sadeleştirip, okunurluğu artırabiliriz. Bunun için bir PartialViewResult methodu oluşturalım.

public PartialViewResult Partial()
{
    return PartialView("Partial");
}

Daha sonra bu methodumuzun üzerine gelip sağ tıklayıp Add View ekranında viewa bir isim verdikten sonra View Options kısmında Create as a partial view seçip bir view ekleyelim. Eğer methodumuzun return olan PartialView() methodu içerisinde bir Partial view ismi yazıyorsa, o viewi yükler. Eğer return olan partialview() methodunun içerisi boş ise, yani hiç bir view sayfasını yüklemek istemiyorsak yukarıdaki oluşturduğumuz ve kendi belirlediğimiz isimdeki partial view’i yükler.

Şimdi ise sırada herhangi bir view sayfasının içerisinden yukarıda oluşturduğumuz Partial isimli methodu çağırma işlemi var. Bu methodu çağırdığımızda partial view render edilmiş olacak.

@Html.Action("Partial", "Home")

Böylece Html helper yardımı ile sayfamızda partial view render etmiş olduk.

Reklamlar

Generic Repository ve Unit of Work Pattern, Entity Framework, Unit Testing, Autofac IoC Container ve ASP.NET MVC [Part 2]

Bir önceki makalemde model, servis ve repository katmanları oluşturdum. Bu makalemde ise oluşturduğum katmanlarla CRUD işlemlerini yapacağız ve Autofac IoC Container kuracağım.

Setup AutoFac:

Mvc projesi içinde Package Manager Console ekranındaki command satırına şu komutu yazın:

Install-Package Autofac.Mvc5

Ayrıca bu komut Autofac’ı da install edecektir.

Autofac kurulumu ile classlarımızı da register etmeye başlayabiliriz. Modules adında bir folder oluşturalım ve içine şu dosyaları alsın:

RepositoryModule.cs

public class RepositoryModule : Autofac.Module
   {
       protected override void Load(ContainerBuilder builder)
       {
           builder.RegisterAssemblyTypes(Assembly.Load("SampleArch.Repository"))
                  .Where(t => t.Name.EndsWith("Repository"))
                  .AsImplementedInterfaces()
                 .InstancePerLifetimeScope();
       }
   }

Bu işlem Autofac içindeki bütün classların sonuna “Repository” getirerek classları register edecektir.ServiceModule.cs

public class ServiceModule : Autofac.Module
  {
      protected override void Load(ContainerBuilder builder)
      {
          builder.RegisterAssemblyTypes(Assembly.Load("SampleArch.Service"))
                    .Where(t => t.Name.EndsWith("Service"))
                    .AsImplementedInterfaces()
                    .InstancePerLifetimeScope();
      }
  }

Bu işlem Autofac içindeki bütün classların sonuna “Service” getirerek classları register edecektir.

EFModule.cs

public class EFModule : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterModule(new RepositoryModule());
            builder.RegisterType(typeof(SampleArchContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
            builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).InstancePerRequest();        
        }
    }

Global.asax dosyası içindeki Application_Start methodu içerisine bazı satırlar ekleyelim:

//Autofac Configuration
          var builder = new Autofac.ContainerBuilder();
          builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
          builder.RegisterModule(new RepositoryModule());
          builder.RegisterModule(new ServiceModule());
          builder.RegisterModule(new EFModule());
          var container = builder.Build();
          DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

Ayrıca şu namespaceleri de eklememiz gerekmektedir.

using Autofac.Integration.Mvc;
using Autofac;

Artık service objesini controller classları içerisine enjekte edebiliriz.

Country CRUD Implementasyonu:

Mvc projesinin içerisine Model ve Servis projelerinin referanslarını ekleyelim. Yeni bir controller ekleyip optionunu “MVC 5 Controller with Views using Entity Framework” seçelim. Name : CountryController,  Select Model : “Country“, DataContext:SampleArchContext, Set “Generate Views” true, Click Add deyip controller ekleme işini tamamlayalım. Böylece EF kullanarak action ve viewları implement etmiş olduk. Şimdi controllerımızı service katmanına göre modifiye edelim:

public class CountryController : Controller
   {
       //initialize service object
       ICountryService _CountryService;
       public CountryController(ICountryService CountryService)
       {
           _CountryService = CountryService;
       }
       //
       // GET: /Country/
       public ActionResult Index()
       {
           return View(_CountryService.GetAll());
       }      
       //
       // GET: /Country/Create
       public ActionResult Create()
       {
           return View();
       }
       //
       // POST: /Country/Create
       [HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult Create(Country country)
       {
           // TODO: Add insert logic here
           if (ModelState.IsValid)
           {
               _CountryService.Create(country);
               return RedirectToAction("Index");
           }
           return View(country);
       }
       //
       // GET: /Country/Edit/5
       public ActionResult Edit(int id)
       {           
           Country country = _CountryService.GetById(id);
           if (country == null)
           {
               return HttpNotFound();
           }
           return View(country);
       }
       //
       // POST: /Country/Edit
       [HttpPost]
       public ActionResult Edit(Country country)
       {
           if (ModelState.IsValid)
           {
               _CountryService.Update(country);
               return RedirectToAction("Index");
           }
           return View(country);
       }
       //
       // GET: /Country/Delete/5
       public ActionResult Delete(int id)
       {
           Country country = _CountryService.GetById(id);
           if (country == null)
           {
               return HttpNotFound();
           }
           return View(country);
       }
       //
       // POST: /Country/Delete/5
       [HttpPost, ActionName("Delete")]
       [ValidateAntiForgeryToken]
       public ActionResult Delete(int id, FormCollection data)
       {
           Country country = _CountryService.GetById(id);
           _CountryService.Delete(country);
           return RedirectToAction("Index");
       }
   }

Yukarıda gördüğünüz gibi Controller classımızın constructoruna servis katmanından gelen ICountryService objesini enjekte ettik. Constructor Dependency injection controller classımız teste uygun hale getirir.

Şimdi relationship içeren diğer CRUD işlemlerinin gözden geçirelim :

Person CRUD Implementasyonu :

CountryControllara benzer bir şekilde PersonController ekliyoruz. Aşağıda Entity Framework yapısı kullanarak Country dropdownList oluşturacağız. CountryController’da olduğu gibi servis katmanı ile PersonController classını da modifiye edelim.

public class PersonController : Controller
  {
      IPersonService _PersonService;
      ICountryService _CountryService;
      public PersonController(IPersonService PersonService, ICountryService CountryService)
      {
          _PersonService = PersonService;
          _CountryService = CountryService;
      }
      // GET: /Person/
      public ActionResult Index()
      {
          return View(_PersonService.GetAll());
      }
      // GET: /Person/Details/5
      public ActionResult Details(long? id)
      {
          if (id == null)
          {
              return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
          }
          Person person = _PersonService.GetById(id.Value);
          if (person == null)
          {
              return HttpNotFound();
          }
          return View(person);
      }
      // GET: /Person/Create
      public ActionResult Create()
      {
          ViewBag.CountryId = new SelectList(_CountryService.GetAll(), "Id", "Name");
          return View();
      }
      // POST: /Person/Create
      // To protect from overposting attacks, please enable the specific properties you want to bind to, for
      // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
      [HttpPost]
      [ValidateAntiForgeryToken]
      public ActionResult Create([Bind(Include = "Id,Name,Phone,Address,State,CountryId")] Person person)
      {
          if (ModelState.IsValid)
          {
              _PersonService.Create(person);
              return RedirectToAction("Index");
          }
          ViewBag.CountryId = new SelectList(_CountryService.GetAll(), "Id", "Name", person.CountryId);
          return View(person);
      }
      // GET: /Person/Edit/5
      public ActionResult Edit(long? id)
      {
          if (id == null)
          {
              return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
          }
          Person person = _PersonService.GetById(id.Value);
          if (person == null)
          {
              return HttpNotFound();
          }
          ViewBag.CountryId = new SelectList(_CountryService.GetAll(), "Id", "Name", person.CountryId);
          return View(person);
      }
      // POST: /Person/Edit/5
      // To protect from overposting attacks, please enable the specific properties you want to bind to, for
      // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
      [HttpPost]
      [ValidateAntiForgeryToken]
      public ActionResult Edit([Bind(Include = "Id,Name,Phone,Address,State,CountryId")] Person person)
      {
          if (ModelState.IsValid)
          {
              _PersonService.Update(person);
              return RedirectToAction("Index");
          }
          ViewBag.CountryId = new SelectList(_CountryService.GetAll(), "Id", "Name", person.CountryId);
          return View(person);
      }
      // GET: /Person/Delete/5
      public ActionResult Delete(long? id)
      {
          if (id == null)
          {
              return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
          }
          Person person = _PersonService.GetById(id.Value);
          if (person == null)
          {
              return HttpNotFound();
          }
          return View(person);
      }
      // POST: /Person/Delete/5
      [HttpPost, ActionName("Delete")]
      [ValidateAntiForgeryToken]
      public ActionResult DeleteConfirmed(long id)
      {
          Person person = _PersonService.GetById(id);
          _PersonService.Delete(person);
          return RedirectToAction("Index");
      }
  }

Yukarda da gördüğümüz bu controllerımızın constructoruna üzere hem CountryService , hem de PersonService nesnesini enjekte ettik. Çünkü controllerımızda her iki servisimize de erişmemiz gerekti. CountryService, ülkelerin dropdown seçimi için, PersonService ise CRUD işlemleri için gerekliydi.

Sonuç olarak view ekranımız şu şekilde olacaktır:

crud-autofac

ÖZET:

Bu makalemde Autofac kurulumunu ve Entity Framework ve Service Katmanları ile Generic Repository ve Unit of Work Pattern üzerinden base alarak CRUD işlemlerinin nasıl yapıldığını öğrendik. Diğer makalemde farklı katmanların Unit Test implementasyonunu anlatacağım.

İyi Çalışmalar.

Durum

Controllers

Controller, MVC mimari katmanının önemli bir parçasıdır. Kısaca GET ve POST işlemlerini yerine getirir diyebiliriz. Önce eğer herhangi bir model ile ilgili işlem yapılacaksa, ilgili modelin propertylerini set edip, model ile işleyip viewa gönderir, kullanıcıdan modelde yaptıkları değişiklikleri POST ederek tekrar controllera gönderir. Post edildiğini de ilgili controllerımızın üzerinde [HttpPost] attribute ile anlarız. Ya da model ile ilgili bir işlem yapmayacaksak veya form ile çalışmayacaksak viewa ViewBag, ViewData, TempData gibi bellekte yer ayırıp veri tutan bir propertydir. ViewBag, ViewData ve TempDatanın ne olduğunu daha sonra anlatacağım. Peki yeni bir controller oluşturmak için ne yapmamız gerekir :

Controller

Controller oluşturduktan sonra önümüze aşağıdaki gibi bir ekran gelecektir. Eğer hiç bir model ile controllerımızı ilişkilendirmeyip boş bir controller oluşturmak istersek template kısmından Empty Controller seçip, controllerımıza da isim verip controller oluşturma ekranımızı tamamlayabiliriz.

Controller1

Bundling and Minification

Asp.net MVC 4’ün destek verdiği aynı bundling and minification frameworku ASP.Net MVC 4.5 te içermektedir. Peki ne işe yarar bundling and minification?

Bundlelar

Bu sistem içine birkaç script referansı ekleyip birleştirerek sayfanıza gelen requestları yani istekleri azaltır ve tek bir request haline getirir. Bu da sitenizin yüklenme zamanındaki performans kaybını azaltır. Peki bundle ayarlarını nerde yaparız? Asp.net MVC projemizdeki /App_Start/BundleConfig.cs dosyamızda, projemizdeki Layout view içinde hangi still veya hangi script dosyalarının referans edildiğini görebiliriz. veya kendimiz de referans etmek istediğimiz dosyaları ekleyebiliriz. Örnek olarak MVC Internet Application templatei default olarak versiyon numarası bağlanmamış bir jquery bundle dosyası bulundurur :

bundles.Add(new ScriptBundle(“~/bundles/jquery”).Include(
“~/Scripts/jquery-{version}.js”));

Referans olarak eklediğimiz bundleları sitemizde çağırmak için hangi URL’yi layoutta (_Layout.cshtml) çağırmamız gerekiyor sorusunun cevabı ise :

@Scripts.Render(“~/bundles/jquery”)

Minifacation : 

Gereksiz boşlukların, koddaki satır sonu ve yorum satırlarının kaldırılması yükleme sürelerinin iyileştirilmesi için bir süreçtir. Yani still ve script dosyalarımızı optimize edip istemciye giden dosya boyutunun küçülmesini ve request sayısının azalmasını sağlar.

Asp.net MVC 4 Proje Oluşturma

ASP.NET MVC 4 ü daha iyi anlayabilmek için örnek bir proje oluşturup, onun üzerinde inceleme yapabiliriz.

ASP.NET MVC 4 İçin Yazılım Gereksinimleri

  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows Server 2003
  • Windows Server 2008
  • Windows Server 2008 R2
MVC 4 geliştirme araçları Visual Studio 2012 de hazır gelmektedir. Visual Studio 2010 SP1/Visual Web Developer 2010 Express SP1 ortamlarına da yüklenebilir.
ASP.NET MVC 4 Uygulaması Oluşturma

  1. File > New Project
    2.  ASP.NET MVC 4 Webb Application ı seçiyoruz.
    3. Uygulama ismini girip OK seçin.
Uygulama Şablonları
 
Yeni proje oluşturup OK a bastığımızda karşımıza aşağıdaki gibi bir pencere gelecek. Bu pencereden hazır proje şablonu seçebiliriz.
Buradaki şablonların kısaca tanımı;
  • The Internet Application Template: Bu şablonda gerekli olan scriptler, css ler, üyelik için gerekli sınıflar ve fonksiyonlar, kısacası hazır çalışan bir web uygulaması şeklinde bir şablon gelir.
  • The Intranet Application Template: Internet Application Template ile aynıdır, tek farkı ASP.NET Membership üyelik sistemi yerine Windows Kullanıcı Hesaplarını kullanır.
  • The Basic Template: Css ve scriptler vardır. Model ve controller klasörleri boş olarak gelir.
  • The Empty Template: Boş bir proje gelir. Sadece App_Start klasöründe routing ve filter ayarları yapılmıştır.
  • The Mobile Application Template: Internet Application Template gibi çalışan bir uygulama olarak gelir. Scriptler ve css ler tamamen mobil tarayıcılar için uygun olarak gelir.
  • The Web API Template: Yine çalışabilir bir hazır bir şablondur. Üyelik yönetimi yoktur. HTTP servis için gerekli ayarlar yapılmıştır.
Görüntüleme Motorları (View Engines)
 
Şablon seçiminin altında sözdizimini kullanacağımız görüntüleme aracınıda seçebiliriz. Derslerimiz boyunca Razor ile örneklerimizi yapacağız.
 
Test
 
Bütün şablonlar için test projesi seçilebilir durumdadır.
Eğer test projeside eklemek istiyorsak, Create a unit test project seçeneğiniz işaretliyoruz. Seçimden sonra iki seçenek daha gelir.
  1. Test project name: Test projesinin ismini belirlediğimiz alan.
  2. Test framework: Test altyapısını seçtiğimiz alan. Yüklü olan altyapılar görünür varsayılan olarak Visual Studio Unit Test yüklü olarak gelir. Farklı (like xUnit, NUnit, MbUnit, … vb) altyapılarda yükleyebiliriz.