Görünüm Ana sayfalarına Veri Geçirme (C#)

Microsoft tarafından

PDF’yi İndir

Bu öğreticinin amacı, bir denetleyiciden görünüm ana sayfasına nasıl veri geçirebileceğinizi açıklamaktır. Bir görünüm ana sayfasına veri geçirmek için iki stratejiyi inceleyeceğiz. İlk olarak, bakımı zor bir uygulamaya neden olan kolay bir çözümü tartışacağız. Daha sonra, biraz daha başlangıç çalışması gerektiren ancak çok daha sürdürülebilir bir uygulamayla sonuçlanabilen çok daha iyi bir çözümü inceleyeceğiz.

Ana Sayfaları Görüntülemek için Veri Geçirme

Bu öğreticinin amacı, bir denetleyiciden görünüm ana sayfasına nasıl veri geçirebileceğinizi açıklamaktır. Bir görünüm ana sayfasına veri geçirmek için iki stratejiyi inceleyeceğiz. İlk olarak, bakımı zor bir uygulamaya neden olan kolay bir çözümü tartışacağız. Daha sonra, biraz daha başlangıç çalışması gerektiren ancak çok daha sürdürülebilir bir uygulamayla sonuçlanabilen çok daha iyi bir çözümü inceleyeceğiz.

Sorun

Bir film veritabanı uygulaması oluşturduğunuzu ve uygulamanızdaki her sayfada film kategorilerinin listesini görüntülemek istediğinizi düşünün (bkz. Şekil 1). Ayrıca film kategorileri listesinin bir veritabanı tablosunda depolandığını düşünün. Bu durumda, kategorileri veritabanından almak ve film kategorilerinin listesini bir görünüm ana sayfasında işlemek mantıklı olacaktır.

Görünüm ana sayfasında film kategorilerini görüntüleme

Şekil 01: Bir görünüm ana sayfasında film kategorilerini görüntüleme (Tam boyutlu resmi görüntülemek için tıklayın)

Sorun şu. Ana sayfadaki film kategorilerinin listesini nasıl alırsınız? Doğrudan ana sayfada model sınıflarınızın yöntemlerini çağırmak caziptir. Başka bir deyişle, verileri veritabanından alma kodunu doğrudan ana sayfanıza eklemek caziptir. Ancak, veritabanına erişmek için MVC denetleyicilerinizin atlanması, MVC uygulaması oluşturmanın birincil avantajlarından biri olan endişelerin temiz ayrımını ihlal eder.

Bir MVC uygulamasında, MVC görünümleriniz ve MVC modeliniz arasındaki tüm etkileşimin MVC denetleyicileriniz tarafından işlenmesini istersiniz. Bu endişe ayrımı daha sürdürülebilir, uyarlanabilir ve test edilebilir bir uygulama ile sonuçlanabilir.

MVC uygulamasında, görünüm ana sayfası dahil olmak üzere bir görünüme geçirilen tüm veriler bir denetleyici eylemi tarafından bir görünüme geçirilmelidir. Ayrıca, verilerin görüntüleme verilerinden yararlanılarak geçirilmesi gerekir. Bu öğreticinin geri kalanında, görünüm verilerini bir görünüm ana sayfasına geçirmenin iki yöntemini inceliyorum.

Basit Çözüm

Görünüm verilerini bir denetleyiciden bir görünüm ana sayfasına geçirmeye yönelik en basit çözümle başlayalım. En basit çözüm, ana sayfanın görünüm verilerini her denetleyici eyleminde geçirmektir.

Liste 1'deki denetleyiciyi göz önünde bulundurun. ve Details()adlı Index() iki eylemi kullanıma sunar. Eylem yöntemi, Index() Filmler veritabanı tablosundaki her filmi döndürür. Eylem yöntemi, Details() belirli bir film kategorisindeki her filmi döndürür.

Listeleme 1 – Controllers\HomeController.cs

using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
     [HandleError]
     public class HomeController : Controller
     {
          private MovieDataContext _dataContext = new MovieDataContext();

          /// <summary>

          /// Show list of all movies
          /// </summary>
          public ActionResult Index()
          {
               ViewData["categories"] = from c in _dataContext.MovieCategories 
                         select c;
               ViewData["movies"] = from m in _dataContext.Movies 
                         select m;
               return View();
          }

          /// <summary>
          /// Show list of movies in a category
          /// </summary>

          public ActionResult Details(int id)
          {
               ViewData["categories"] = from c in _dataContext.MovieCategories 
                         select c;
               ViewData["movies"] = from m in _dataContext.Movies 
                         where m.CategoryId == id
                         select m;
               return View();
          }
     }
}

Hem Index() hem de Details() eylemlerinin verileri görüntülemek için iki öğe eklediğini görebilirsiniz. Index() eylemi iki anahtar ekler: kategoriler ve filmler. Kategoriler anahtarı, görünüm ana sayfası tarafından görüntülenen film kategorilerinin listesini temsil eder. Filmler anahtarı, Dizin görünümü sayfası tarafından görüntülenen filmlerin listesini temsil eder.

Details() eylemi ayrıca kategoriler ve filmler adlı iki anahtar ekler. Kategoriler anahtarı, bir kez daha, görünüm ana sayfası tarafından görüntülenen film kategorilerinin listesini temsil eder. Filmler tuşu, Ayrıntılar görünüm sayfası tarafından görüntülenen belirli bir kategorideki filmlerin listesini temsil eder (bkz. Şekil 2).

Ayrıntılar görünümü

Şekil 02: Ayrıntılar görünümü (Tam boyutlu resmi görüntülemek için tıklayın)

Dizin görünümü Liste 2'de yer alır. Yalnızca görüntüleme verilerindeki film öğesi tarafından temsil edilen film listesinde yinelenir.

Listeleme 2 – Views\Home\Index.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>

<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

<ul>

<% foreach (var m in (IEnumerable<Movie>)ViewData["movies"])
     { %>

     <li><%= m.Title %></li>

<% } %>
</ul>

</asp:Content>

Görünüm ana sayfası Liste 3'te yer alır. Görünüm ana sayfası, görünüm verilerinden kategoriler öğesiyle temsil edilen tüm film kategorilerini yineler ve işler.

Listeleme 3 – Views\Shared\Site.master

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.Master.cs" Inherits="MvcApplication1.Views.Shared.Site" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
     <title></title>
     <asp:ContentPlaceHolder ID="head" runat="server">

     </asp:ContentPlaceHolder>
</head>
<body>
     <div>
          <h1>My Movie Website</h1>

          <% foreach (var c in (IEnumerable<MovieCategory>)ViewData["categories"])
                           {%>

               <%= Html.ActionLink(c.Name, "Details", new {id=c.Id} ) %> 

          <% } %>


          <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

          </asp:ContentPlaceHolder>
     </div>
</body>
</html>

Tüm veriler görünüm verileri aracılığıyla görünüme ve görünüm ana sayfasına geçirilir. Bu, ana sayfaya veri geçirmenin doğru yoludur.

Peki bu çözümün nesi var? Sorun, bu çözümün DRY (Kendinizi Tekrarlama) ilkesini ihlal ediyor olmasıdır. Her denetleyici eyleminin verileri görüntülemek için aynı film kategorisi listesini eklemesi gerekir. Uygulamanızda yinelenen kod olması, uygulamanızın bakımını, uyarlamasını ve değiştirmesini çok daha zor hale getirir.

İyi Çözüm

Bu bölümde, bir denetleyici eyleminden görünüm ana sayfasına veri geçirmenin alternatif ve daha iyi bir çözümünü inceleyeceğiz. Her denetleyici eyleminde ana sayfa için film kategorilerini eklemek yerine film kategorilerini görüntüleme verilerine yalnızca bir kez ekleriz. Görünüm ana sayfası tarafından kullanılan tüm görünüm verileri bir Uygulama denetleyicisine eklenir.

ApplicationController sınıfı Listeleme 4'te yer alır.

Listeleme 4 – Controllers\ApplicationController.cs

using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
     public abstract class ApplicationController : Controller
     {
          private MovieDataContext _dataContext = new MovieDataContext();

          public MovieDataContext DataContext
          {
               get { return _dataContext; }
          }

          public ApplicationController()
          {
               ViewData["categories"] = from c in DataContext.MovieCategories 
                         select c;
          }

     }
}

Liste 4'te Uygulama denetleyicisi hakkında fark edilmesi gereken üç şey vardır. İlk olarak, sınıfın temel System.Web.Mvc.Controller sınıfından devralınan olduğuna dikkat edin. Uygulama denetleyicisi bir denetleyici sınıfıdır.

İkinci olarak, Uygulama denetleyicisi sınıfının soyut bir sınıf olduğuna dikkat edin. Soyut sınıf, somut bir sınıf tarafından uygulanması gereken bir sınıftır. Uygulama denetleyicisi soyut bir sınıf olduğundan, doğrudan sınıfında tanımlanan hiçbir yöntemi çağıramazsınız. Uygulama sınıfını doğrudan çağırmayı denerseniz Kaynak Bulunamadı hata iletisi alırsınız.

Üçüncü olarak, Uygulama denetleyicisinin verileri görüntülemek için film kategorilerinin listesini ekleyen bir oluşturucu içerdiğine dikkat edin. Uygulama denetleyicisinden devralan her denetleyici sınıfı, Uygulama denetleyicisinin oluşturucusunu otomatik olarak çağırır. Uygulama denetleyicisinden devralınan herhangi bir denetleyicide herhangi bir eylem çağırdığınızda, film kategorileri görünüm verilerine otomatik olarak eklenir.

Listeleme 5'teki Filmler denetleyicisi, Uygulama denetleyicisinden devralır.

Listeleme 5 – Controllers\MoviesController.cs

using System.Linq;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
     public class MoviesController : ApplicationController
     {
          /// <summary>

          /// Show list of all movies
          /// </summary>
          public ActionResult Index()
          {
               ViewData["movies"] = from m in DataContext.Movies 
                         select m;
               return View();
          }

          /// <summary>
          /// Show list of movies in a category
          /// </summary>

          public ActionResult Details(int id)
          {
               ViewData["movies"] = from m in DataContext.Movies
                         where m.CategoryId == id
                         select m;
               return View();
          }

     }
}

Önceki bölümde ele alınan Giriş denetleyicisinde olduğu gibi Filmler denetleyicisi de ve Details()adlı Index() iki eylem yöntemini kullanıma sunar. Görünüm ana sayfası tarafından görüntülenen film kategorileri listesinin veya Details() yöntemindeki verileri görüntülemek için eklenmediğine Index() dikkat edin. Filmler denetleyicisi Uygulama denetleyicisinden devralındığından, verileri otomatik olarak görüntülemek için film kategorileri listesi eklenir.

Bir görünüm ana sayfası için görünüm verileri eklemeye yönelik bu çözümün DRY (Kendinizi Tekrarlama) ilkesini ihlal etmediğini fark edin. Verileri görüntülemek için film kategorilerinin listesini ekleme kodu tek bir konumda bulunur: Uygulama denetleyicisinin oluşturucusunda.

Özet

Bu öğreticide, görünüm verilerini bir denetleyiciden bir görünüm ana sayfasına geçirmeye yönelik iki yaklaşımı ele aldık. İlk olarak basit ama bakımı zor bir yaklaşımı inceledik. İlk bölümde, uygulamanızdaki her denetleyici eyleminde bir görünüm ana sayfası için görüntüleme verilerini nasıl ekleyebileceğinizi ele aldık. Bunun kötü bir yaklaşım olduğu sonucuna vardık çünkü DRY (Kendinizi Tekrar etmeyin) ilkesini ihlal ediyor.

Ardından, verileri görüntülemek için ana sayfayı görüntülemenin gerektirdiği verileri eklemeye yönelik çok daha iyi bir stratejiyi inceledik. Görünüm verilerini her denetleyici eylemine eklemek yerine, görünüm verilerini bir Uygulama denetleyicisi içinde yalnızca bir kez ekledik. Bu şekilde, bir ASP.NET MVC uygulamasındaki bir görünüm ana sayfasına veri geçirirken yinelenen kodlardan kaçınabilirsiniz.