ASP.NET MVC Denetleyicisine Genel Bakış (C#)

tarafından Stephen Walther

Bu öğreticide Stephen Walther size ASP.NET MVC denetleyicilerini tanıtır. Yeni denetleyiciler oluşturmayı ve farklı eylem sonuçları türlerini döndürmeyi öğrenirsiniz.

Bu öğreticide ASP.NET MVC denetleyicileri, denetleyici eylemleri ve eylem sonuçları konusu incelanmaktadır. Bu öğreticiyi tamamladıktan sonra, bir ziyaretçinin ASP.NET MVC web sitesiyle etkileşim kurma şeklini denetlemek için denetleyicilerin nasıl kullanıldığını anlayacaksınız.

Denetleyicileri Anlama

MVC denetleyicileri, bir ASP.NET MVC web sitesinde yapılan isteklere yanıt vermekten sorumludur. Her tarayıcı isteği belirli bir denetleyiciyle eşlenir. Örneğin, tarayıcınızın adres çubuğuna aşağıdaki URL'yi girdiğinizi düşünün:

http://localhost/Product/Index/3

Bu durumda, ProductController adlı bir denetleyici çağrılır. ProductController, tarayıcı isteğine yanıt oluşturmakla sorumludur. Örneğin, denetleyici belirli bir görünümü tarayıcıya geri döndürebilir veya denetleyici kullanıcıyı başka bir denetleyiciye yönlendirebilir.

Liste 1, ProductController adlı basit bir denetleyici içerir.

Listing1 - Controllers\ProductController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Products/

        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Liste 1'den görebileceğiniz gibi denetleyici yalnızca bir sınıftır (Visual Basic .NET veya C# sınıfı). Denetleyici, temel System.Web.Mvc.Controller sınıfından türetilen bir sınıftır. Denetleyici bu temel sınıftan devraldığından, denetleyici birkaç yararlı yöntemi ücretsiz olarak devralır (Bu yöntemleri birazdan ele alıyoruz).

Denetleyici Eylemlerini Anlama

Denetleyici, denetleyici eylemlerini kullanıma sunar. Eylem, tarayıcı adres çubuğuna belirli bir URL girdiğinizde çağrılan bir denetleyici yöntemidir. Örneğin, aşağıdaki URL için bir istekte bulunduğunu düşünün:

http://localhost/Product/Index/3

Bu durumda, Index() yöntemi ProductController sınıfında çağrılır. Index() yöntemi bir denetleyici eylemi örneğidir.

Denetleyici eylemi, denetleyici sınıfının genel bir yöntemi olmalıdır. C# yöntemleri varsayılan olarak özel yöntemlerdir. Denetleyici sınıfına eklediğiniz tüm genel yöntemlerin otomatik olarak denetleyici eylemi olarak kullanıma sunulduğunun farkında olun (Bir denetleyici eylemi, evrendeki herkes tarafından tarayıcı adres çubuğuna doğru URL'yi yazarak çağrılabildiği için bu konuda dikkatli olmalısınız).

Denetleyici eylemi tarafından karşılanması gereken bazı ek gereksinimler vardır. Denetleyici eylemi olarak kullanılan bir yöntem aşırı yüklenemez. Ayrıca, denetleyici eylemi statik bir yöntem olamaz. Bunun dışında, herhangi bir yöntemi denetleyici eylemi olarak kullanabilirsiniz.

Eylem Sonuçlarını Anlama

Denetleyici eylemi, eylem sonucu olarak adlandırılan bir şey döndürür. Eylem sonucu, denetleyici eyleminin tarayıcı isteğine yanıt olarak döndürdüğü sonuçdur.

ASP.NET MVC çerçevesi aşağıdakiler gibi çeşitli eylem sonuçlarını destekler:

  1. ViewResult - HTML ve işaretlemeyi temsil eder.
  2. EmptyResult - Hiçbir sonucu temsil eder.
  3. RedirectResult - Yeni bir URL'ye yeniden yönlendirmeyi temsil eder.
  4. JsonResult - AJAX uygulamasında kullanılabilecek bir JavaScript Nesne Gösterimi sonucunu temsil eder.
  5. JavaScriptResult - JavaScript betiğini temsil eder.
  6. ContentResult - Metin sonucunu temsil eder.
  7. FileContentResult - İndirilebilir bir dosyayı (ikili içerikle) temsil eder.
  8. FilePathResult - İndirilebilir bir dosyayı (bir yol ile) temsil eder.
  9. FileStreamResult - İndirilebilir bir dosyayı (dosya akışıyla) temsil eder.

Bu eylem sonuçlarının tümü temel ActionResult sınıfından devralınır.

Çoğu durumda, denetleyici eylemi bir ViewResult döndürür. Örneğin, Liste 2'deki Dizin denetleyicisi eylemi bir ViewResult döndürür.

Listeleme 2 - Controllers\BookController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class BookController : Controller
    {
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

Bir eylem ViewResult döndürdüğünde, HTML tarayıcıya döndürülür. Listeleme 2'deki Index() yöntemi, tarayıcıya Index adlı bir görünüm döndürür.

Liste 2'deki Index() eyleminin ViewResult() döndürmediğini göreceksiniz. Bunun yerine, Denetleyici temel sınıfının View() yöntemi çağrılır. Normalde, doğrudan bir eylem sonucu döndürmezsiniz. Bunun yerine, Denetleyici temel sınıfının aşağıdaki yöntemlerinden birini çağırırsınız:

  1. Görünüm - ViewResult eylem sonucu döndürür.
  2. Redirect - RedirectResult eylem sonucunu döndürür.
  3. RedirectToAction - RedirectToRouteResult eylem sonucunu döndürür.
  4. RedirectToRoute - RedirectToRouteResult eylem sonucunu döndürür.
  5. Json - Bir JsonResult eylem sonucu döndürür.
  6. JavaScriptResult - Bir JavaScriptResult döndürür.
  7. content - ContentResult eylem sonucunu döndürür.
  8. File - Yöntemine geçirilen parametrelere bağlı olarak bir FileContentResult, FilePathResult veya FileStreamResult döndürür.

Bu nedenle, tarayıcıya bir Görünüm döndürmek istiyorsanız View() yöntemini çağırırsınız. Kullanıcıyı bir denetleyici eyleminden diğerine yeniden yönlendirmek istiyorsanız RedirectToAction() yöntemini çağırırsınız. Örneğin, Liste 3'teki Details() eylemi bir görünüm görüntüler veya id parametresinin değeri olup olmadığına bağlı olarak kullanıcıyı Index() eylemine yönlendirir.

Listeleme 3 - CustomerController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Details(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            return View();
        }

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

    }
}

ContentResult eylem sonucu özeldir. Bir eylem sonucunu düz metin olarak döndürmek için ContentResult eylem sonucunu kullanabilirsiniz. Örneğin, Listeleme 4'teki Index() yöntemi bir iletiyi HTML olarak değil düz metin olarak döndürür.

Liste 4 - Controllers\StatusController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}

StatusController.Index() eylemi çağrıldığında bir görünüm döndürülmüyor. Bunun yerine, "Merhaba Dünya!" ham metni tarayıcıya döndürülür.

Denetleyici eylemi, eylem sonucu olmayan bir sonuç (örneğin, tarih veya tamsayı) döndürürse, sonuç otomatik olarak contentResult içine sarmalanır. Örneğin, Liste 5'te WorkController'ın Index() eylemi çağrıldığında, tarih otomatik olarak ContentResult olarak döndürülür.

Liste 5 - WorkController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class WorkController : Controller
    {
        public DateTime Index()
        {
            return DateTime.Now;
        }
    }
}

Liste 5'teki Index() eylemi bir DateTime nesnesi döndürür. ASP.NET MVC çerçevesi DateTime nesnesini bir dizeye dönüştürür ve Bir ContentResult içindeki DateTime değerini otomatik olarak sarmalar. Tarayıcı tarih ve saati düz metin olarak alır.

Özet

Bu öğreticinin amacı size ASP.NET MVC denetleyicileri, denetleyici eylemleri ve denetleyici eylem sonuçları kavramlarını tanıtmaktı. İlk bölümde, bir ASP.NET MVC projesine yeni denetleyiciler eklemeyi öğrendinize. Ardından, bir denetleyicinin genel yöntemlerinin evrene denetleyici eylemleri olarak nasıl maruz olduğunu öğrendin. Son olarak, bir denetleyici eyleminden döndürülebilecek farklı eylem sonuçları türlerini ele aldık. Özellikle, bir denetleyici eyleminden ViewResult, RedirectToActionResult ve ContentResult'un nasıl döndürüleceği açıklandı.