Freigeben über


Übergeben von Daten an Ansichtsmasterseiten (C#)

von Microsoft

PDF herunterladen

In diesem Tutorial wird erläutert, wie Sie Daten von einem Controller an eine Ansicht master Seite übergeben können. Wir untersuchen zwei Strategien zum Übergeben von Daten an eine Ansicht master Seite. Zunächst besprechen wir eine einfache Lösung, die zu einer schwer zu verwaltenden Anwendung führt. Als Nächstes untersuchen wir eine viel bessere Lösung, die etwas mehr anfängliche Arbeit erfordert, aber zu einer viel verwaltbareren Anwendung führt.

Übergeben von Daten an Ansichtsvorlagen

In diesem Tutorial wird erläutert, wie Sie Daten von einem Controller an eine Ansicht master Seite übergeben können. Wir untersuchen zwei Strategien zum Übergeben von Daten an eine Ansicht master Seite. Zunächst besprechen wir eine einfache Lösung, die zu einer schwer zu verwaltenden Anwendung führt. Als Nächstes untersuchen wir eine viel bessere Lösung, die etwas mehr anfängliche Arbeit erfordert, aber zu einer viel verwaltbareren Anwendung führt.

Problemstellung

Stellen Sie sich vor, Sie erstellen eine Filmdatenbankanwendung und möchten die Liste der Filmkategorien auf jeder Seite in Ihrer Anwendung anzeigen (siehe Abbildung 1). Stellen Sie sich außerdem vor, dass die Liste der Filmkategorien in einer Datenbanktabelle gespeichert ist. In diesem Fall wäre es sinnvoll, die Kategorien aus der Datenbank abzurufen und die Liste der Filmkategorien innerhalb einer Ansicht master Seite zu rendern.

Anzeigen von Filmkategorien in einer Ansicht master Seite

Abbildung 01: Anzeigen von Filmkategorien in einer Ansicht master Seite (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Hier ist das Problem. Wie rufen Sie die Liste der Filmkategorien auf der Seite master ab? Es ist verlockend, Methoden Ihrer Modellklassen direkt auf der Seite master aufzurufen. Anders ausgedrückt: Es ist verführerisch, den Code zum Abrufen der Daten aus der Datenbank direkt auf Der seite master einzuschließen. Das Umgehen Ihrer MVC-Controller für den Zugriff auf die Datenbank würde jedoch gegen die sauber Trennung von Problemen verstoßen, die einer der Hauptvorteile des Erstellens einer MVC-Anwendung ist.

In einer MVC-Anwendung soll die gesamte Interaktion zwischen Ihren MVC-Ansichten und Ihrem MVC-Modell von Ihren MVC-Controllern verarbeitet werden. Diese Trennung der Bedenken führt zu einer besser verwaltbaren, anpassungsfähigen und testbaren Anwendung.

In einer MVC-Anwendung sollten alle an eine Ansicht übergebenen Daten – einschließlich einer Ansicht master Seite – von einer Controlleraktion an eine Ansicht übergeben werden. Darüber hinaus sollten die Daten übergeben werden, indem die Ansichtsdaten genutzt werden. Im weiteren Verlauf dieses Tutorials werden zwei Methoden zum Übergeben von Ansichtsdaten an eine Ansicht master Seite untersucht.

Die einfache Lösung

Beginnen wir mit der einfachsten Lösung zum Übergeben von Ansichtsdaten von einem Controller an eine Ansicht master Seite. Die einfachste Lösung besteht darin, die Ansichtsdaten für die master-Seite in jeder Controlleraktion zu übergeben.

Betrachten Sie den Controller in Listing 1. Es macht zwei Aktionen mit dem Namen Index() und Details()verfügbar. Die Index() Aktionsmethode gibt jeden Film in der Movies-Datenbanktabelle zurück. Die Details() Aktionsmethode gibt jeden Film in einer bestimmten Filmkategorie zurück.

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

Beachten Sie, dass sowohl die Aktionen Index() als auch Details() zwei Elemente zum Anzeigen von Daten hinzufügen. Die Index()-Aktion fügt zwei Schlüssel hinzu: Kategorien und Filme. Der Kategorienschlüssel stellt die Liste der Filmkategorien dar, die von der Ansicht master Seite angezeigt werden. Der Filmschlüssel stellt die Liste der Filme dar, die auf der Seite Indexansicht angezeigt werden.

Die Aktion Details() fügt auch zwei Schlüssel mit dem Namen Kategorien und Filme hinzu. Der Kategorienschlüssel stellt erneut die Liste der Filmkategorien dar, die von der Ansicht master Seite angezeigt werden. Der Filmschlüssel stellt die Liste der Filme in einer bestimmten Kategorie dar, die auf der Seite Detailansicht angezeigt wird (siehe Abbildung 2).

Die Detailansicht

Abbildung 02: Die Detailansicht (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Die Indexansicht ist in Listing 2 enthalten. Es durchläuft einfach die Liste der Filme, die durch das Element "Filme" in den Ansichtsdaten dargestellt werden.

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

Die Ansicht master Seite ist in Eintrag 3 enthalten. Die Ansicht master Seite durchläuft und rendert alle Filmkategorien, die durch das Kategorieelement aus Ansichtsdaten dargestellt werden.

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

Alle Daten werden an die Ansicht und die Ansicht master Seite über Ansichtsdaten übergeben. Dies ist die richtige Methode, um Daten an die seite master zu übergeben.

Was ist also falsch an dieser Lösung? Das Problem ist, dass diese Lösung gegen das DRY-Prinzip (Don't Repeat Yourself) verstößt. Jede Controlleraktion muss die gleiche Liste von Filmkategorien hinzufügen, um Daten anzuzeigen. Wenn Sie doppelten Code in Ihrer Anwendung haben, ist die Verwaltung, Anpassung und Änderung Ihrer Anwendung erheblich schwieriger.

Die gute Lösung

In diesem Abschnitt untersuchen wir eine alternative und bessere Lösung zum Übergeben von Daten von einer Controlleraktion an eine Ansicht master Seite. Anstatt die Filmkategorien für die master-Seite in jeder Controlleraktion hinzuzufügen, fügen wir die Filmkategorien den Ansichtsdaten nur einmal hinzu. Alle Ansichtsdaten, die von der Ansicht master Seite verwendet werden, werden in einem Anwendungscontroller hinzugefügt.

Die ApplicationController-Klasse ist in Listing 4 enthalten.

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

     }
}

Es gibt drei Dinge, die Sie über den Anwendungscontroller in Listing 4 beachten sollten. Beachten Sie zunächst, dass die -Klasse von der System.Web.Mvc.Controller-Basisklasse erbt. Der Anwendungscontroller ist eine Controllerklasse.

Beachten Sie zweitens, dass die Application-Controllerklasse eine abstrakte Klasse ist. Eine abstrakte Klasse ist eine Klasse, die von einer konkreten Klasse implementiert werden muss. Da der Application-Controller eine abstrakte Klasse ist, können Sie keine methoden aufrufen, die in der -Klasse definiert sind. Wenn Sie versuchen, die Application-Klasse direkt aufzurufen, erhalten Sie die Fehlermeldung Ressource kann nicht gefunden werden.

Drittens: Der Anwendungscontroller enthält einen Konstruktor, der die Liste der Filmkategorien hinzufügt, um Daten anzuzeigen. Jede Controllerklasse, die vom Application-Controller erbt, ruft automatisch den Konstruktor des Anwendungscontrollers auf. Wenn Sie eine Aktion auf einem Controller aufrufen, der vom Anwendungscontroller erbt, werden die Filmkategorien automatisch in die Ansichtsdaten eingeschlossen.

Der Movies-Controller in Listing 5 erbt vom Anwendungscontroller.

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

     }
}

Der Movies-Controller macht genau wie der im vorherigen Abschnitt erläuterte Home-Controller zwei Aktionsmethoden mit dem Namen Index() und Details()verfügbar. Beachten Sie, dass die Liste der Von der Ansicht master Seite angezeigten Filmkategorien nicht hinzugefügt wird, um Daten weder in der -Methode noch in der Index()Details() -Methode anzuzeigen. Da der Filme-Controller vom Anwendungscontroller erbt, wird die Liste der Filmkategorien hinzugefügt, um Daten automatisch anzuzeigen.

Beachten Sie, dass diese Lösung zum Hinzufügen von Ansichtsdaten für eine Ansicht master Seite nicht gegen das DRY-Prinzip (Don't Repeat Yourself) verstößt. Der Code zum Hinzufügen der Liste der Filmkategorien zum Anzeigen von Daten ist nur an einem Speicherort enthalten: dem Konstruktor für den Anwendungscontroller.

Zusammenfassung

In diesem Tutorial wurden zwei Ansätze zum Übergeben von Ansichtsdaten von einem Controller an eine Ansicht master Seite erläutert. Zunächst haben wir einen einfachen, aber schwierig zu verwaltenden Ansatz untersucht. Im ersten Abschnitt wurde erläutert, wie Sie Ansichtsdaten für eine Ansicht master Seite in jeder Controlleraktion in Ihrer Anwendung hinzufügen können. Wir kamen zu dem Schluss, dass dies ein schlechter Ansatz war, da er gegen das DRY-Prinzip (Don't Repeat Yourself) verstößt.

Als Nächstes haben wir eine viel bessere Strategie zum Hinzufügen von Daten untersucht, die für eine Ansicht master Seite zum Anzeigen von Daten erforderlich sind. Anstatt die Ansichtsdaten in jeder Controlleraktion hinzuzufügen, haben wir die Ansichtsdaten nur einmal innerhalb eines Anwendungscontrollers hinzugefügt. Auf diese Weise können Sie doppelte Code beim Übergeben von Daten an eine Ansicht master Seite in einer ASP.NET MVC-Anwendung vermeiden.