Bagikan melalui


Meneruskan Data untuk Menampilkan Halaman Master (C#)

oleh Microsoft

Unduh PDF

Tujuan tutorial ini adalah untuk menjelaskan bagaimana Anda dapat meneruskan data dari pengontrol ke halaman master tampilan. Kami memeriksa dua strategi untuk meneruskan data ke halaman master tampilan. Pertama, kita membahas solusi mudah yang menghasilkan aplikasi yang sulit dipertahankan. Selanjutnya, kami memeriksa solusi yang jauh lebih baik yang membutuhkan sedikit lebih banyak pekerjaan awal tetapi menghasilkan aplikasi yang jauh lebih dapat dipertahankan.

Meneruskan Data untuk Menampilkan Halaman Master

Tujuan tutorial ini adalah untuk menjelaskan bagaimana Anda dapat meneruskan data dari pengontrol ke halaman master tampilan. Kami memeriksa dua strategi untuk meneruskan data ke halaman master tampilan. Pertama, kita membahas solusi mudah yang menghasilkan aplikasi yang sulit dipertahankan. Selanjutnya, kami memeriksa solusi yang jauh lebih baik yang membutuhkan sedikit lebih banyak pekerjaan awal tetapi menghasilkan aplikasi yang jauh lebih dapat dipertahankan.

Masalahnya

Bayangkan Anda sedang membangun aplikasi database film dan Anda ingin menampilkan daftar kategori film di setiap halaman di aplikasi Anda (lihat Gambar 1). Bayangkan, selain itu, bahwa daftar kategori film disimpan dalam tabel database. Dalam hal ini, masuk akal untuk mengambil kategori dari database dan merender daftar kategori film dalam halaman master tampilan.

Menampilkan kategori film dalam halaman master tampilan

Gambar 01: Menampilkan kategori film di halaman master tampilan (Klik untuk melihat gambar ukuran penuh)

Ini masalahnya. Bagaimana Anda mengambil daftar kategori film di halaman master? Sangat menggoda untuk memanggil metode kelas model Anda di halaman master secara langsung. Dengan kata lain, sangat menggoda untuk menyertakan kode untuk mengambil data dari database langsung di halaman master Anda. Namun, melewati pengontrol MVC Anda untuk mengakses database akan melanggar pemisahan kekhawatiran yang bersih yang merupakan salah satu manfaat utama membangun aplikasi MVC.

Dalam aplikasi MVC, Anda ingin semua interaksi antara tampilan MVC dan model MVC Anda ditangani oleh pengontrol MVC Anda. Pemisahan kekhawatiran ini menghasilkan aplikasi yang lebih dapat dipertahankan, dapat disesuaikan, dan dapat diuji.

Dalam aplikasi MVC, semua data yang diteruskan ke tampilan - termasuk halaman master tampilan - harus diteruskan ke tampilan oleh tindakan pengontrol. Selain itu, data harus diteruskan dengan memanfaatkan data tampilan. Di sisa tutorial ini, saya memeriksa dua metode meneruskan data tampilan ke halaman master tampilan.

Solusi Sederhana

Mari kita mulai dengan solusi paling sederhana untuk meneruskan data tampilan dari pengontrol ke halaman master tampilan. Solusi paling sederhana adalah meneruskan data tampilan untuk halaman master di setiap tindakan pengontrol.

Pertimbangkan pengontrol di Daftar 1. Ini mengekspos dua tindakan bernama Index() dan Details(). Metode Index() tindakan mengembalikan setiap film dalam tabel database Film. Metode Details() aksi mengembalikan setiap film dalam kategori film tertentu.

Daftar 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();
          }
     }
}

Perhatikan bahwa tindakan Index() dan Details() menambahkan dua item untuk melihat data. Tindakan Index() menambahkan dua kunci: kategori dan film. Kunci kategori mewakili daftar kategori film yang ditampilkan oleh halaman master tampilan. Kunci film mewakili daftar film yang ditampilkan oleh halaman Tampilan indeks.

Tindakan Details() juga menambahkan dua kunci bernama kategori dan film. Kunci kategori, sekali lagi, mewakili daftar kategori film yang ditampilkan oleh halaman master tampilan. Kunci film mewakili daftar film dalam kategori tertentu yang ditampilkan oleh halaman tampilan Detail (lihat Gambar 2).

Tampilan Detail

Gambar 02: Tampilan Detail (Klik untuk melihat gambar ukuran penuh)

Tampilan Indeks terkandung dalam Daftar 2. Ini hanya berulang melalui daftar film yang diwakili oleh item film dalam data tampilan.

Daftar 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>

Halaman master tampilan terkandung dalam Daftar 3. Halaman master tampilan mengulangi dan merender semua kategori film yang diwakili oleh item kategori dari data tampilan.

Daftar 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>

Semua data diteruskan ke tampilan dan halaman master tampilan melalui data tampilan. Itu adalah cara yang benar untuk meneruskan data ke halaman master.

Jadi, apa yang salah dengan solusi ini? Masalahnya adalah bahwa solusi ini melanggar prinsip DRY (Jangan Ulangi Diri Anda). Setiap tindakan pengontrol harus menambahkan daftar kategori film yang sama untuk melihat data. Memiliki kode duplikat dalam aplikasi Anda membuat aplikasi Anda jauh lebih sulit untuk dipertahankan, diadaptasi, dan dimodifikasi.

Solusi yang Baik

Di bagian ini, kami memeriksa solusi alternatif, dan lebih baik untuk meneruskan data dari tindakan pengontrol ke halaman master tampilan. Alih-alih menambahkan kategori film untuk halaman master di setiap tindakan pengontrol, kami menambahkan kategori film ke data tampilan hanya sekali. Semua data tampilan yang digunakan oleh halaman master tampilan ditambahkan dalam pengontrol Aplikasi.

Kelas ApplicationController terkandung dalam Daftar 4.

Daftar 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;
          }

     }
}

Ada tiga hal yang harus Anda perhatikan tentang pengontrol Aplikasi di Daftar 4. Pertama, perhatikan bahwa kelas mewarisi dari kelas System.Web.Mvc.Controller dasar. Pengontrol Aplikasi adalah kelas pengontrol.

Kedua, perhatikan bahwa kelas Pengontrol aplikasi adalah kelas abstrak. Kelas abstrak adalah kelas yang harus diimplementasikan oleh kelas konkret. Karena pengontrol Aplikasi adalah kelas abstrak, Anda tidak dapat memanggil metode apa pun yang ditentukan di kelas secara langsung. Jika Anda mencoba memanggil kelas Aplikasi secara langsung maka Anda akan mendapatkan pesan kesalahan Sumber Daya Tidak Dapat Ditemukan.

Ketiga, perhatikan bahwa pengontrol Aplikasi berisi konstruktor yang menambahkan daftar kategori film untuk melihat data. Setiap kelas pengontrol yang mewarisi dari pengontrol Aplikasi memanggil konstruktor pengontrol Aplikasi secara otomatis. Setiap kali Anda memanggil tindakan apa pun pada pengontrol apa pun yang mewarisi dari pengontrol Aplikasi, kategori film disertakan dalam data tampilan secara otomatis.

Pengontrol Film di Daftar 5 mewarisi dari pengontrol Aplikasi.

Daftar 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();
          }

     }
}

Pengontrol Film, sama seperti pengontrol Home yang dibahas di bagian sebelumnya, mengekspos dua metode tindakan bernama Index() dan Details(). Perhatikan bahwa daftar kategori film yang ditampilkan oleh halaman master tampilan tidak ditambahkan untuk melihat data dalam Index() metode atau Details() . Karena pengontrol Film mewarisi dari pengontrol Aplikasi, daftar kategori film ditambahkan untuk melihat data secara otomatis.

Perhatikan bahwa solusi ini untuk menambahkan data tampilan untuk halaman master tampilan tidak melanggar prinsip DRY (Jangan Ulangi Diri Anda). Kode untuk menambahkan daftar kategori film untuk melihat data hanya terkandung dalam satu lokasi: konstruktor untuk pengontrol Aplikasi.

Ringkasan

Dalam tutorial ini, kita membahas dua pendekatan untuk meneruskan data tampilan dari pengontrol ke halaman master tampilan. Pertama, kami memeriksa pendekatan yang sederhana, tetapi sulit dipertahankan. Di bagian pertama, kami membahas bagaimana Anda dapat menambahkan data tampilan untuk halaman master tampilan di setiap tindakan pengontrol di aplikasi Anda. Kami menyimpulkan bahwa ini adalah pendekatan yang buruk karena melanggar prinsip DRY (Jangan Ulangi Diri Anda).

Selanjutnya, kami memeriksa strategi yang jauh lebih baik untuk menambahkan data yang diperlukan oleh halaman master tampilan untuk melihat data. Alih-alih menambahkan data tampilan di setiap tindakan pengontrol, kami menambahkan data tampilan hanya sekali dalam pengontrol Aplikasi. Dengan demikian, Anda dapat menghindari kode duplikat saat meneruskan data ke halaman master tampilan di aplikasi MVC ASP.NET.