Freigeben über


Übergeben von Daten an Ansichtsmasterseiten (VB)

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 wird eine einfache Lösung erläutert, 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 zum Anzeigen von Gestaltungsvorlagen

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 wird eine einfache Lösung erläutert, 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, die Liste der Filmkategorien wird in einer Datenbanktabelle gespeichert. In diesem Fall wäre es sinnvoll, die Kategorien aus der Datenbank abzurufen und die Liste der Filmkategorien in einer Ansicht master Seite zu rendern.

Anzeigen von Filmkategorien in einer Ansicht master Seite

Abbildung 01: Anzeigen von Filmkategorien in einer Ansicht master Seite (Zum Anzeigen des Bilds in voller Größe hier klicken)

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. Mit anderen Worten, es ist verlockend, den Code zum Abrufen der Daten aus der Datenbank direkt auf Ihrer master-Seite aufzunehmen. Das Umgehen Ihrer MVC-Controller für den Zugriff auf die Datenbank würde jedoch gegen die sauber Trennung von Bedenken 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 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 durch Nutzung der Ansichtsdaten übergeben werden. Im weiteren Verlauf dieses Tutorials untersuchte ich zwei Methoden zum Übergeben von Ansichtsdaten an eine Ansicht master Seite.

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.vb

<HandleError()> _
Public Class HomeController
     Inherits System.Web.Mvc.Controller

     Private _dataContext As New MovieDataContext()

     ''' <summary>

     ''' Show list of all movies
     ''' </summary>
     Function Index()
          ViewData("categories") = From c In _dataContext.MovieCategories _
                    Select c
          ViewData("movies") = From m In _dataContext.Movies _
                    Select m
          Return View()
     End Function

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

     Function Details(ByVal id As Integer)
          ViewData("categories") = From c In _dataContext.MovieCategories _
                    Select c
          ViewData("movies") = From m In _dataContext.Movies _
                    Where m.CategoryId = id _
                    Select m
          Return View()
     End Function

End Class

Beachten Sie, dass sowohl die Index() - als auch die Details() -Aktion zwei Elemente hinzufügen, um Daten anzuzeigen. 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. Die Filmtaste stellt die Liste der Filme dar, die auf der Seite Indexansicht angezeigt werden.

Die Details() Aktion 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. Die Filmtaste 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 Filmelement in den Ansichtsdaten dargestellt werden.

Eintrag 2 – Views\Home\Index.aspx

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>

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

<ul>

<%  For Each m In ViewData("movies")%>

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

<% Next%>
</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 Kategorienelement aus Ansichtsdaten dargestellt werden.

Eintrag 3 – Views\Shared\Site.master

<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site.Master.vb" Inherits="MvcApplication1.Site" %>

<%@ Import Namespace="MvcApplication1" %>
<!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>

          <% For Each c In ViewData("categories")%>

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

          <% Next%>


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

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

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

Was ist also falsch an dieser Lösung? Das Problem besteht darin, dass diese Lösung gegen das DRY-Prinzip (Don't Repeat Yourself) verstößt. Jede Controlleraktion muss dieselbe Liste von Filmkategorien hinzufügen, um Daten anzuzeigen. Wenn Sie in Ihrer Anwendung doppelten Code 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 von der Ansicht master Seite verwendeten Ansichtsdaten werden in einem Anwendungscontroller hinzugefügt.

Die ApplicationController-Klasse ist in Listing 4 enthalten.

Die ApplicationController-Klasse ist in Listing 4 enthalten.

Eintrag 4 – Controllers\ApplicationController.vb

Public MustInherit Class ApplicationController
     Inherits System.Web.Mvc.Controller

     Private _dataContext As New MovieDataContext()

     Public ReadOnly Property DataContext() As MovieDataContext
          Get

               Return _dataContext
          End Get
     End Property


     Sub New()
          ViewData("categories") = From c In DataContext.MovieCategories _
                    Select c
     End Sub

End Class

Es gibt drei Dinge, die Sie am 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 MustInherit-Klasse ist. Eine MustInherit-Klasse ist eine Klasse, die von einer konkreten Klasse implementiert werden muss. Da der Application-Controller eine MustInherit-Klasse ist, können Sie keine in der -Klasse definierten Methoden direkt aufrufen. Wenn Sie versuchen, die Application-Klasse direkt aufzurufen, wird die Fehlermeldung Resource Cannot Be Found angezeigt.

Beachten Sie drittens, dass der Anwendungscontroller einen Konstruktor enthält, 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 für einen Controller aufrufen, der vom Anwendungscontroller erbt, werden die Filmkategorien automatisch in die Ansichtsdaten einbezogen.

Der Filmcontroller in Listing 5 erbt vom Anwendungscontroller.

Eintrag 5 – Controllers\MoviesController.vb

<HandleError()> _
Public Class MoviesController
     Inherits ApplicationController

     ''' <summary>
     ''' Show list of all movies
     ''' </summary>
     Function Index()
          ViewData("movies") = From m In DataContext.Movies _
                    Select m
          Return View()

      End Function

     ''' <summary>
     ''' Show list of movies in a category
     ''' </summary>
     Function Details(ByVal id As Integer)
          ViewData("movies") = From m In DataContext.Movies _
                    Where m.CategoryId = id _
                    Select m
          Return View()
     End Function

End Class

Der Movies-Controller macht genau wie der im vorherigen Abschnitt erläuterte Startcontroller zwei Aktionsmethoden mit dem Namen Index() und Details()verfügbar. Beachten Sie, dass die Liste der Filmkategorien, die von der Ansicht master Seite angezeigt wird, nicht hinzugefügt wird, um Daten in der Index() -Methode oder Details() anzuzeigen. Da der Filmcontroller 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 haben wir 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 haben wir 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 es 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 doppelten Code vermeiden, wenn Sie Daten an eine Ansicht master Seite in einer ASP.NET MVC-Anwendung übergeben.