Freigeben über


Sortieren, Filtern und Paging mit dem Entity Framework in einer ASP.NET MVC-Anwendung (3 von 10)

von Tom Dykstra

Die Contoso University-Beispielwebanwendung veranschaulicht, wie sie ASP.NET MVC 4-Anwendungen mithilfe von Entity Framework 5 Code First und Visual Studio 2012 erstellen. Informationen zu dieser Tutorialreihe finden Sie im ersten Tutorial der Reihe.

Hinweis

Wenn ein Problem auftritt, das Sie nicht beheben können, laden Sie das abgeschlossene Kapitel herunter , und versuchen Sie, das Problem zu reproduzieren. Im Allgemeinen können Sie die Lösung für das Problem finden, indem Sie Ihren Code mit dem abgeschlossenen Code vergleichen. Einige häufige Fehler und deren Behebung finden Sie unter Fehler und Problemumgehungen.

Im vorherigen Tutorial haben Sie eine Reihe von Webseiten für grundlegende CRUD-Vorgänge für Student Entitäten implementiert. In diesem Tutorial fügen Sie der Seite Students Index funktionen zum Sortieren, Filtern und Paging hinzu. Sie werden auch eine Seite erstellen, auf der einfache Gruppierungsvorgänge ausgeführt werden.

Die folgende Abbildung zeigt, wie die Seite am Ende aussehen wird. Die Spaltenüberschriften sind Links, auf die der Benutzer klicken kann, um die Spalte zu sortieren. Wiederholtes Klicken auf eine Spaltenüberschrift schaltet zwischen aufsteigender und absteigender Sortierreihenfolge um.

Students_Index_page_with_paging

Um der Seite Student Index die Sortierung hinzuzufügen, ändern Sie die Index -Methode des Student Controllers und fügen der Student Indexansicht Code hinzu.

Hinzufügen von Sortierfunktionen zur Index-Methode

Ersetzen Sie in Controllers\StudentController.cs die Index -Methode durch den folgenden Code:

public ActionResult Index(string sortOrder)
{
   ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
   ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";
   var students = from s in db.Students
                  select s;
   switch (sortOrder)
   {
      case "Name_desc":
         students = students.OrderByDescending(s => s.LastName);
         break;
      case "Date":
         students = students.OrderBy(s => s.EnrollmentDate);
         break;
      case "Date_desc":
         students = students.OrderByDescending(s => s.EnrollmentDate);
         break;
      default:
         students = students.OrderBy(s => s.LastName);
         break;
   }
   return View(students.ToList());
}

Dieser Code empfängt einen sortOrder-Parameter aus der Abfragezeichenfolge in der URL. Der Wert der Abfragezeichenfolge wird von ASP.NET MVC als Parameter für die Aktionsmethode bereitgestellt. Der Parameter ist eine Zeichenfolge, entweder „Name“ oder „Date“, optional gefolgt von einem Unterstrich und der Zeichenfolge „desc“, die die absteigende Reihenfolge angibt. Standardmäßig wird eine aufsteigende Sortierreihenfolge verwendet.

Bei der ersten Anforderung der Indexseite gibt es keine Abfragezeichenfolge. Die Kursteilnehmer werden in aufsteigender Reihenfolge von LastNameangezeigt. Dies ist die Standardeinstellung, wie durch den Fallthrough-Fall in der switch -Anweisung festgelegt. Wenn der Benutzer auf den Link einer Spaltenüberschrift klickt, wird der entsprechende sortOrder-Wert in der Abfragezeichenfolge bereitgestellt.

Die beiden ViewBag Variablen werden verwendet, damit die Ansicht die Spaltenüberschriftenlinks mit den entsprechenden Abfragezeichenfolgenwerten konfigurieren kann:

ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";

Hierbei handelt es sich um ternäre Anweisungen. Die erste gibt an, dass, wenn der sortOrder Parameter NULL oder leer ist, ViewBag.NameSortParm auf "name_desc" festgelegt werden soll. Andernfalls sollte er auf eine leere Zeichenfolge festgelegt werden. Diese beiden Anweisungen ermöglichen der Ansicht das Festlegen der Links für Spaltenüberschriften wie folgt:

Aktuelle Sortierreihenfolge Hyperlink „Nachname“ Hyperlink „Datum“
Nachname (aufsteigend) descending ascending
Nachname (absteigend) ascending ascending
Datum (aufsteigend) ascending descending
Datum (absteigend) ascending ascending

Die -Methode verwendet LINQ to Entities, um die Spalte anzugeben, nach der sortiert werden soll. Der Code erstellt eine IQueryable-Variable vor der switch -Anweisung, ändert sie in der switch -Anweisung und ruft die ToList -Methode nach der switch -Anweisung auf. Es wir keine Abfrage an die Datenbank gesendet, wenn Sie die IQueryable-Variablen erstellen und ändern. Die Abfrage wird erst ausgeführt, wenn Sie das IQueryable -Objekt durch Aufrufen einer -Methode wie ToListz. B. in eine Auflistung konvertieren. Daher führt dieser Code zu einer einzelnen Abfrage, die erst in der return View -Anweisung ausgeführt wird.

Ersetzen Sie in Views\Student\Index.cshtml die <tr> Elemente und <th> für die Überschriftenzeile durch den hervorgehobenen Code:

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm })
        </th>
        <th>First Name
        </th>
        <th>
            @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm })
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {

Dieser Code verwendet die Informationen in den ViewBag Eigenschaften, um Links mit den entsprechenden Abfragezeichenfolgenwerten einzurichten.

Führen Sie die Seite aus, und klicken Sie auf die Spaltenüberschriften Nachname und Registrierungsdatum , um zu überprüfen, ob die Sortierung funktioniert.

Screenshot: Seite

Nachdem Sie auf die Überschrift Nachname geklickt haben, werden die Kursteilnehmer in absteigender Nachnamensreihenfolge angezeigt.

Screenshot: Seite

Hinzufügen eines Suchfelds zur Seite "Schülerindex"

Wenn Sie eine Filterfunktion zur Studentenindexseite hinzufügen möchten, dann fügen Sie ein Textfeld und die Schaltfläche „Senden“ zur Ansicht hinzu, und führen Sie die entsprechenden Änderungen in der Index-Methode aus. Sie können eine Zeichenfolge in das Textfeld für Vor- und Nachnamen eingeben, um eine Suche zu starten.

Hinzufügen von Filterfunktionen zur Index-Methode

Ersetzen Sie in Controllers\StudentController.cs die Index -Methode durch den folgenden Code (die Änderungen sind hervorgehoben):

public ViewResult Index(string sortOrder, string searchString)
{
    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
    var students = from s in db.Students
                   select s;
    if (!String.IsNullOrEmpty(searchString))
    {
        students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
                               || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
    }
    switch (sortOrder)
    {
        case "name_desc":
            students = students.OrderByDescending(s => s.LastName);
            break;
        case "Date":
            students = students.OrderBy(s => s.EnrollmentDate);
            break;
        case "date_desc":
            students = students.OrderByDescending(s => s.EnrollmentDate);
            break;
        default:
            students = students.OrderBy(s => s.LastName);
            break;
    }

    return View(students.ToList());
}

Sie haben einen searchString-Parameter zur Index-Methode hinzugefügt. Außerdem haben Sie der LINQ-Anweisung eine where -Klausel hinzugefügt, die nur Kursteilnehmer auswählt, deren Vorname oder Nachname die Suchzeichenfolge enthält. Der Suchzeichenfolgenwert wird aus einem Textfeld empfangen, das Sie der Indexansicht hinzufügen. Die Anweisung, die die where-Klausel hinzufügt, wird nur ausgeführt, wenn ein Wert für die Suche vorhanden ist.

Hinweis

In vielen Fällen können Sie dieselbe Methode entweder für einen Entity Framework-Entitätssatz oder als Erweiterungsmethode für eine In-Memory-Sammlung aufrufen. Die Ergebnisse sind normalerweise identisch, können aber in einigen Fällen unterschiedlich sein. Beispielsweise gibt die .NET Framework Implementierung der Contains -Methode alle Zeilen zurück, wenn Sie eine leere Zeichenfolge an sie übergeben, aber der Entity Framework-Anbieter für SQL Server Compact 4.0 gibt null Zeilen für leere Zeichenfolgen zurück. Daher stellt der Code im Beispiel (das Einfügen der Where -Anweisung in eine if -Anweisung) sicher, dass Sie für alle Versionen von SQL Server die gleichen Ergebnisse erhalten. Außerdem führt die .NET Framework Implementierung der Contains -Methode standardmäßig einen Vergleich zwischen Groß- und Kleinschreibung durch, aber Entity Framework SQL Server Anbieter führen standardmäßig Vergleiche ohne Berücksichtigung der Groß-/Kleinschreibung durch. Wenn Sie die ToUpper -Methode aufrufen, um die Groß-/Kleinschreibung des Tests explizit zu berücksichtigen, wird daher sichergestellt, dass sich die Ergebnisse nicht ändern, wenn Sie den Code später ändern, um ein Repository zu verwenden, das eine IEnumerable Auflistung anstelle eines IQueryable Objekts zurückgibt. (Beim Aufrufen der Contains-Methode einer IEnumerable-Sammlung erhalten Sie die .NET Framework-Implementierung. Wenn Sie sie auf einem IQueryable-Objekt aufrufen, erhalten Sie die Implementierung des Datenanbieters.)

Hinzufügen eines Suchfelds zur Studentenindexansicht

Fügen Sie in Views\Student\Index.cshtml den hervorgehobenen Code unmittelbar vor dem öffnenden table Tag hinzu, um eine Untertitel, ein Textfeld und eine Schaltfläche Suchen zu erstellen.

<p>
    @Html.ActionLink("Create New", "Create")
</p>

@using (Html.BeginForm())
{
    <p>
        Find by name: @Html.TextBox("SearchString")  
        <input type="submit" value="Search" /></p>
}

<table>
    <tr>

Führen Sie die Seite aus, geben Sie eine Suchzeichenfolge ein, und klicken Sie auf Suchen , um zu überprüfen, ob die Filterung funktioniert.

Students_Index_page_with_search_box

Beachten Sie, dass die URL die Suchzeichenfolge "an" nicht enthält. Wenn Sie also ein Lesezeichen für diese Seite einfügen, erhalten Sie die gefilterte Liste nicht, wenn Sie das Lesezeichen verwenden. Sie ändern die Schaltfläche Suchen weiter unten im Tutorial, um Abfragezeichenfolgen für Filterkriterien zu verwenden.

Hinzufügen von Paging zur Seite "Schülerindex"

Um paging zur Seite Students Index hinzuzufügen, installieren Sie zunächst das NuGet-Paket PagedList.Mvc . Anschließend nehmen Sie zusätzliche Änderungen an der Index -Methode vor und fügen der Index Ansicht Paginglinks hinzu. PagedList.Mvc ist eines von vielen guten Paging- und Sortierpaketen für ASP.NET MVC, und die Verwendung hier ist nur als Beispiel gedacht, nicht als Empfehlung dafür gegenüber anderen Optionen. Die folgende Abbildung zeigt die Paginglinks.

Screenshot der Seite

Installieren des PagedList.MVC-NuGet-Pakets

Das NuGet PagedList.Mvc-Paket installiert das PagedList-Paket automatisch als Abhängigkeit. Das PagedList-Paket installiert einen PagedList Sammlungstyp und Erweiterungsmethoden für IQueryable - und IEnumerable -Auflistungen. Die Erweiterungsmethoden erstellen eine einzelne Seite von Daten in einer PagedList Sammlung von oder IQueryableIEnumerable, und die PagedList Auflistung stellt mehrere Eigenschaften und Methoden bereit, die das Paging erleichtern. Das PagedList.Mvc-Paket installiert ein Paginghilfsprogramm, das die Pagingschaltflächen anzeigt.

Wählen Sie im Menü Extras die Option NuGet-Paket-Manager und dann NuGet-Pakete für Projektmappe verwalten aus.

Klicken Sie im Dialogfeld NuGet-Pakete verwalten auf der linken Seite auf die Registerkarte Online , und geben Sie dann "paged" in das Suchfeld ein. Wenn das PagedList.Mvc-Paket angezeigt wird, klicken Sie auf Installieren.

Screenshot: Dialogfeld

Klicken Sie im Feld Projekte auswählen auf OK.

Screenshot: Dialogfeld

Hinzufügen von Pagingfunktionen zur Index-Methode

Fügen Sie in Controllers\StudentController.cs eine Anweisung für den PagedList Namespace hinzuusing:

using PagedList;

Ersetzen Sie die Index-Methode durch folgenden Code:

public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
   ViewBag.CurrentSort = sortOrder;
   ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
   ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

   if (searchString != null)
   {
      page = 1;
   }
   else
   {
      searchString = currentFilter;
   }

   ViewBag.CurrentFilter = searchString;

   var students = from s in db.Students
                  select s;
   if (!String.IsNullOrEmpty(searchString))
   {
      students = students.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper())
                             || s.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
   }
   switch (sortOrder)
   {
      case "name_desc":
         students = students.OrderByDescending(s => s.LastName);
         break;
      case "Date":
         students = students.OrderBy(s => s.EnrollmentDate);
         break;
      case "date_desc":
         students = students.OrderByDescending(s => s.EnrollmentDate);
         break;
      default:  // Name ascending 
         students = students.OrderBy(s => s.LastName);
         break;
   }

   int pageSize = 3;
   int pageNumber = (page ?? 1);
   return View(students.ToPagedList(pageNumber, pageSize));
}

Dieser Code fügt der Methodensignatur einen page Parameter, einen aktuellen Sortierreihenfolgeparameter und einen aktuellen Filterparameter hinzu, wie hier gezeigt:

public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)

Wenn die Seite zum ersten Mal angezeigt wird oder wenn der Benutzer nicht auf einen Paging- oder Sortierlink geklickt hat, werden alle Parameter gleich 0 (null) sein. Wenn auf einen Paginglink geklickt wird, enthält die page Variable die anzuzeigende Seitenzahl.

A ViewBag -Eigenschaft stellt die Ansicht mit der aktuellen Sortierreihenfolge bereit, da diese in den Auslagerungslinks enthalten sein muss, damit die Sortierreihenfolge beim Paging unverändert bleibt:

ViewBag.CurrentSort = sortOrder;

Eine andere Eigenschaft, ViewBag.CurrentFilter, stellt die Ansicht mit der aktuellen Filterzeichenfolge bereit. Dieser Wert muss in den Paginglinks enthalten sein, damit die Filtereinstellungen während des Pagingvorgangs beibehalten werden, und er muss im Textfeld wiederhergestellt werden, wenn die Seite erneut angezeigt wird. Wenn die Suchzeichenfolge während des Pagingvorgangs geändert wird, muss die Seite auf 1 zurückgesetzt werden, da der neue Filter andere Daten anzeigen kann. Die Suchzeichenfolge wird geändert, wenn ein Wert in das Textfeld eingegeben und die Schaltfläche Senden gedrückt wird. In diesem Fall ist der searchString Parameter nicht NULL.

if (searchString != null)
        page = 1;
else
    searchString = currentFilter;

Am Ende der Methode konvertiert die ToPagedList Erweiterungsmethode für das Students-Objekt IQueryable die Schülerabfrage in eine einzelne Seite von Kursteilnehmern in einem Sammlungstyp, der paging unterstützt. Diese einzelne Seite der Kursteilnehmer wird dann an die Ansicht übergeben:

int pageSize = 3;
int pageNumber = (page ?? 1);
return View(students.ToPagedList(pageNumber, pageSize));

Die ToPagedList-Methode nimmt eine Seitenanzahl. Die beiden Fragezeichen stellen den Null-Koalescing-Operator dar. Der Nullzusammensetzungsoperator definiert einen Standardwert für einen Nullable-Typ. Der (page ?? 1)-Ausdruck bedeutet, dass page zurückgegeben wird, wenn dies über einen Wert verfügt, oder 1, wenn page gleich 0 (null) ist.

Ersetzen Sie in Views\Student\Index.cshtml den vorhandenen Code durch den folgenden Code:

@model PagedList.IPagedList<ContosoUniversity.Models.Student>
@using PagedList.Mvc; 
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />

@{
    ViewBag.Title = "Students";
}

<h2>Students</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
    <p>
        Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)  
        <input type="submit" value="Search" />
    </p>
}
<table>
<tr>
    <th></th>
    <th>
        @Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
    </th>
    <th>
        First Name
    </th>
    <th>
        @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
    </th>
</tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |
            @Html.ActionLink("Details", "Details", new { id=item.StudentID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.StudentID })
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FirstMidName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.EnrollmentDate)
        </td>
    </tr>
}

</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount

@Html.PagedListPager( Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter }) )

Die @model-Anweisung am oberen Rand der Seite gibt an, dass die Ansicht nun ein PagedList-Objekt anstelle eines List-Objekts aufruft.

Die using Anweisung für PagedList.Mvc gewährt Zugriff auf das MVC-Hilfsprogramm für die Pagingschaltflächen.

Der Code verwendet eine Überladung von BeginForm , mit der FormMethod.Get angegeben werden kann.

@using (Html.BeginForm("Index", "Student", FormMethod.Get))
{
    <p>
        Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)  
        <input type="submit" value="Search" />
    </p>
}

Der Standardmäßige BeginForm sendet Formulardaten mit einem POST, was bedeutet, dass Parameter im HTTP-Nachrichtentext und nicht in der URL als Abfragezeichenfolgen übergeben werden. Bei der Angabe von HTTP GET werden die Formulardaten als Abfragezeichenfolgen an die URL übergeben. Dadurch können Benutzer ein Lesezeichen für die URL erstellen. Die W3C-Richtlinien für die Verwendung von HTTP GET legen fest, dass Sie GET verwenden sollten, wenn die Aktion nicht zu einer Aktualisierung führt.

Das Textfeld wird mit der aktuellen Suchzeichenfolge initialisiert, sodass Beim Klicken auf eine neue Seite die aktuelle Suchzeichenfolge angezeigt wird.

Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)

Die Spaltenüberschriftenlinks verwenden die Abfragezeichenfolge, um die aktuelle Suchzeichenfolge an den Controller zu übergeben, damit Benutzer Filterergebnisse sortieren können:

@Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })

Die aktuelle Seite und die Gesamtanzahl der Seiten werden angezeigt.

Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount

Wenn keine Seiten angezeigt werden sollen, wird "Seite 0 von 0" angezeigt. (In diesem Fall ist die Seitenzahl größer als die Seitenanzahl, da Model.PageNumber 1 und Model.PageCount 0 ist.)

Die Auslagerungsschaltflächen werden vom PagedListPager Hilfsprogramm angezeigt:

@Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )

Das PagedListPager Hilfsprogramm bietet eine Reihe von Optionen, die Sie anpassen können, einschließlich URLs und Styling. Weitere Informationen finden Sie unter TroyGoode/PagedList auf der GitHub-Website.

Führen Sie die Seite aus.

Screenshot der Seite

Klicken Sie auf die Paginglinks in verschiedenen Sortierreihenfolgen, um sicherzustellen, dass die Paging funktioniert. Geben Sie dann eine Suchzeichenfolge ein. Probieren Sie Paging erneut aus, um sicherzustellen, dass sie auch mit Sortier- und Filtervorgängen ordnungsgemäß funktioniert.

Screenshot: Seite

Erstellen einer Infoseite mit Studentenstatistiken

Auf der Infoseite der Contoso University wird angezeigt, wie viele Studenten sich an welchem Datum angemeldet haben. Das erfordert Gruppieren und einfache Berechnungen dieser Gruppen. Um dies zu erreichen, ist Folgendes erforderlich:

  • Erstellen Sie eine Ansichtsmodellklasse für die Daten, die Sie an die Ansicht übergeben müssen.
  • Ändern Sie die About -Methode im Home Controller.
  • Ändern Sie die About Ansicht.

Erstellen des Ansichtsmodells

Erstellen Sie einen ViewModels-Ordner . Fügen Sie in diesem Ordner die Klassendatei EnrollmentDateGroup.cs hinzu, und ersetzen Sie den vorhandenen Code durch den folgenden Code:

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoUniversity.ViewModels
{
    public class EnrollmentDateGroup
    {
        [DataType(DataType.Date)]
        public DateTime? EnrollmentDate { get; set; }

        public int StudentCount { get; set; }
    }
}

Ändern des Home-Controllers

Fügen Sie in HomeController.cs am Anfang der Datei die folgenden using Anweisungen hinzu:

using ContosoUniversity.DAL;
using ContosoUniversity.ViewModels;

Fügen Sie unmittelbar nach der öffnenden geschweiften Klammer für die -Klasse eine Klassenvariable für den Datenbankkontext hinzu:

public class HomeController : Controller
{
    private SchoolContext db = new SchoolContext();

Ersetzen Sie die About-Methode durch folgenden Code:

public ActionResult About()
{
    var data = from student in db.Students
               group student by student.EnrollmentDate into dateGroup
               select new EnrollmentDateGroup()
               {
                   EnrollmentDate = dateGroup.Key,
                   StudentCount = dateGroup.Count()
               };
    return View(data);
}

Die LINQ-Anweisung gruppiert die Studentenentitäten nach Anmeldedatum, berechnet die Anzahl der Entitäten in jeder Gruppe und speichert die Ergebnisse in einer Sammlung von EnrollmentDateGroup-Ansichtsmodellobjekten.

Fügen Sie eine Methode hinzu Dispose :

protected override void Dispose(bool disposing)
{
    db.Dispose();
    base.Dispose(disposing);
}

Ändern der Infoansicht

Ersetzen Sie den Code in der Datei Views\Home\About.cshtml durch den folgenden Code:

@model IEnumerable<ContosoUniversity.ViewModels.EnrollmentDateGroup>
           
@{
    ViewBag.Title = "Student Body Statistics";
}

<h2>Student Body Statistics</h2>

<table>
    <tr>
        <th>
            Enrollment Date
        </th>
        <th>
            Students
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.EnrollmentDate)
        </td>
        <td>
            @item.StudentCount
        </td>
    </tr>
}
</table>

Führen Sie die App aus, und klicken Sie auf den Link Info . Die Anzahl der Studenten für die jeweiligen Anmeldedatumswerte wird in einer Tabelle angezeigt.

About_page

Optional: Bereitstellen der App in Windows Azure

Bisher wurde Ihre Anwendung lokal in IIS Express auf Ihrem Entwicklungscomputer ausgeführt. Um es für andere Personen verfügbar zu machen, die über das Internet verwendet werden können, müssen Sie es bei einem Webhostinganbieter bereitstellen. In diesem optionalen Abschnitt des Tutorials stellen Sie es auf einer Windows Azure-Website bereit.

Verwenden von Code First-Migrationen zum Bereitstellen der Datenbank

Zum Bereitstellen der Datenbank verwenden Sie Code First-Migrationen. Wenn Sie das Veröffentlichungsprofil erstellen, das Sie zum Konfigurieren der Einstellungen für die Bereitstellung in Visual Studio verwenden, aktivieren Sie ein Kontrollkästchen mit der Bezeichnung Ausführen Code First-Migrationen (wird beim Anwendungsstart ausgeführt). Diese Einstellung bewirkt, dass der Bereitstellungsprozess die Anwendung Web.config Datei auf dem Zielserver automatisch konfiguriert, sodass Code First die MigrateDatabaseToLatestVersion Initialisiererklasse verwendet.

Visual Studio macht während des Bereitstellungsprozesses nichts mit der Datenbank. Wenn die bereitgestellte Anwendung nach der Bereitstellung zum ersten Mal auf die Datenbank zugreift, erstellt Code First automatisch die Datenbank oder aktualisiert das Datenbankschema auf die neueste Version. Wenn die Anwendung eine Migrations-Methode Seed implementiert, wird die Methode ausgeführt, nachdem die Datenbank erstellt oder das Schema aktualisiert wurde.

Ihre Migrations-Methode Seed fügt Testdaten ein. Wenn Sie die Bereitstellung in einer Produktionsumgebung durchführen, müssen Sie die Seed -Methode so ändern, dass sie nur Daten einfügt, die in Ihre Produktionsdatenbank eingefügt werden sollen. In Ihrem aktuellen Datenmodell möchten Sie beispielsweise reale Kurse, aber fiktive Kursteilnehmer in der Entwicklungsdatenbank haben. Sie können eine Seed Methode schreiben, um beide in der Entwicklung zu laden, und dann die fiktiven Kursteilnehmer auskommentieren, bevor Sie die Bereitstellung in der Produktion durchführen. Alternativ können Sie eine Seed Methode schreiben, um nur Kurse zu laden, und die fiktiven Kursteilnehmer manuell über die Benutzeroberfläche der Anwendung in die Testdatenbank eingeben.

Abrufen eines Windows Azure-Kontos

Sie benötigen ein Windows Azure-Konto. Wenn Sie noch nicht über ein Konto verfügen, können Sie in wenigen Minuten ein kostenloses Testkonto erstellen. Einzelheiten hierzu finden Sie unter Windows Azure. Testen Sie es. Kostenlos..

Erstellen einer Website und einer SQL-Datenbank in Windows Azure

Ihre Windows Azure-Website wird in einer freigegebenen Hostingumgebung ausgeführt, was bedeutet, dass sie auf virtuellen Computern (VMs) ausgeführt wird, die für andere Windows Azure-Clients freigegeben werden. Eine freigegebene Hostingumgebung ist eine kostengünstige Möglichkeit, mit der Verwendung der Cloud zu beginnen. Später kann die Anwendung skaliert werden, sobald der Webdatenverkehr zunimmt, um die Anforderungen durch die Ausführung dedizierter virtueller Maschinen zu erfüllen. Wenn Sie eine komplexere Architektur benötigen, können Sie zu einem Windows Azure-Clouddienst migrieren. Clouddienste werden auf dedizierten VMs ausgeführt, die Sie Ihren Anforderungen entsprechend konfigurieren können.

Windows Azure SQL-Datenbank ist ein cloudbasierter relationaler Datenbankdienst, der auf SQL Server Technologien basiert. Tools und Anwendungen, die mit SQL Server funktionieren, funktionieren auch mit SQL-Datenbank.

  1. Klicken Sie im Windows Azure-Verwaltungsportal auf der linken Registerkarte auf Websites , und klicken Sie dann auf Neu.

    Schaltfläche

  2. Klicken Sie auf BENUTZERDEFINIERT ERSTELLEN.

    Screenshot des Dialogfelds

    Der Assistent Neue Website – Benutzerdefiniertes Erstellen wird geöffnet.

  3. Geben Sie im Schritt Neue Website des Assistenten eine Zeichenfolge in das Feld URL ein, die als eindeutige URL für Ihre Anwendung verwendet werden soll. Die vollständige URL besteht aus der hier eingegebenen Zeichenfolge und dem Suffix, das neben dem Textfeld aufgeführt wird. Die Abbildung zeigt "ConU", aber diese URL wird wahrscheinlich verwendet, sodass Sie eine andere URL auswählen müssen.

    Erstellen mit Datenbanklink im Verwaltungsportal

  4. Wählen Sie in der Dropdownliste Region eine Region in Ihrer Nähe aus. Diese Einstellung gibt an, in welchem Rechenzentrum Ihre Website ausgeführt wird.

  5. Wählen Sie in der Dropdownliste Datenbank die Option Kostenlose 20 MB SQL-Datenbank erstellen aus.

    Screenshot des Dialogfelds Website erstellen In der Dropdownliste Datenbank ist Die Option Freie 20 M B S Q L-Datenbank auswählen ausgewählt. Die Schaltfläche

  6. Geben Sie unter DB CONNECTION STRING NAMEden Namen SchoolContext ein.

    Screenshot des Dialogfelds Website erstellen Schulkontext wird im Textfeld Name der D B-Verbindungszeichenfolge ausgefüllt. Die Schaltfläche

  7. Klicken Sie unten im Feld auf den Pfeil, der nach rechts zeigt. Der Assistent wechselt zum Schritt Datenbankeinstellungen .

  8. Geben Sie im Feld Nameden Namen ContosoUniversityDB ein.

  9. Wählen Sie im Feld Server die Option Neuer SQL-Datenbank Server aus. Wenn Sie zuvor einen Server erstellt haben, können Sie diesen Server alternativ aus der Dropdownliste auswählen.

  10. Geben Sie einen Anmeldenamen und ein Kennwort für den Administrator ein. Wenn Sie Neuer SQL-Datenbankserver ausgewählt haben, geben Sie hier keinen vorhandenen Namen und kein vorhandenes Kennwort ein. Stattdessen definieren Sie jetzt einen neuen Namen und ein neues Kennwort zur späteren Verwendung beim Datenbankzugriff. Wenn Sie einen Server ausgewählt haben, den Sie zuvor erstellt haben, geben Sie Anmeldeinformationen für diesen Server ein. In diesem Tutorial aktivieren Sie nicht das Kontrollkästchen Erweitert . Mit den erweiterten Optionen können Sie die Datenbanksortierung festlegen.

  11. Wählen Sie dieselbe Region aus, die Sie für die Website ausgewählt haben.

  12. Klicken Sie unten rechts im Kontrollkästchen auf das Kontrollkästchen, um anzuzeigen, dass Sie fertig sind.

    Screenshot des Dialogfelds Datenbankeinstellungen angeben, in dem alle Einstellungen ausgewählt sind und ein Beispielkennwort in Textfelder enthalten ist. Die Schaltfläche

    Die folgende Abbildung zeigt die Verwendung einer vorhandenen SQL Server und Anmeldung.

    Schritt

    Das Verwaltungsportal kehrt zur Seite Websites zurück, und die Spalte Status zeigt an, dass die Website erstellt wird. Nach einer Weile (in der Regel weniger als eine Minute) zeigt die Spalte Status an, dass die Website erfolgreich erstellt wurde. In der Navigationsleiste auf der linken Seite wird die Anzahl der Websites in Ihrem Konto neben dem Symbol Websites angezeigt, und die Anzahl der Datenbanken wird neben dem Symbol SQL-Datenbanken angezeigt.

Bereitstellen der Anwendung in Windows Azure

  1. Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf das Projekt, und wählen Sie im Kontextmenü Veröffentlichen aus.

  2. Klicken Sie auf der Registerkarte Profil des Assistenten zum Veröffentlichen von Web auf Importieren.

    Veröffentlichungseinstellungen importieren

  3. Wenn Sie Ihr Windows Azure-Abonnement noch nicht in Visual Studio hinzugefügt haben, führen Sie die folgenden Schritte aus. In diesen Schritten fügen Sie Ihr Abonnement hinzu, sodass die Dropdownliste unter Importieren von einer Windows Azure-Website Ihre Website enthält.

    a. Klicken Sie im Dialogfeld Veröffentlichungsprofil importieren auf Importieren von einer Windows Azure-Website, und klicken Sie dann auf Windows Azure-Abonnement hinzufügen.

    Hinzufügen eines Windows Azure-Abonnements

    b. Klicken Sie im Dialogfeld Windows Azure-Abonnements importieren auf Abonnementdatei herunterladen.

    Abonnementdatei herunterladen

    c. Speichern Sie in Ihrem Browserfenster die Datei ".publishsettings" .

    Herunterladen der Datei

    Warnung

    Sicherheit: Die Datei publishsettings enthält Ihre Anmeldeinformationen (nicht codiert), die zum Verwalten Ihrer Windows Azure-Abonnements und -Dienste verwendet werden. Die bewährte Sicherheitsmethode für diese Datei besteht darin, sie vorübergehend außerhalb Ihrer Quellverzeichnisse (z. B. im Ordner Bibliotheken\Dokumente ) zu speichern und nach Abschluss des Imports zu löschen. Ein böswilliger Benutzer, der Zugriff auf die .publishsettings Datei erhält, kann Ihre Windows Azure-Dienste bearbeiten, erstellen und löschen.

    d. Klicken Sie im Dialogfeld Windows Azure-Abonnements importieren auf Durchsuchen , und navigieren Sie zur Datei ".publishsettings" .

    download sub

    e. Klicken Sie auf Importieren.

    Import

  4. Wählen Sie im Dialogfeld Veröffentlichungsprofil importierendie Option Von einer Windows Azure-Website importieren aus, wählen Sie Ihre Website aus der Dropdownliste aus, und klicken Sie dann auf OK.

    Importieren des Veröffentlichungsprofils

  5. Klicken Sie auf der Registerkarte Verbindung auf Verbindung überprüfen , um sicherzustellen, dass die Einstellungen richtig sind.

    Überprüfen der Verbindung

  6. Wenn die Verbindung überprüft wurde, wird neben der Schaltfläche Verbindung überprüfen ein grünes Häkchen angezeigt. Klicken Sie auf Weiter.

    Verbindung erfolgreich überprüft

  7. Öffnen Sie die Dropdownliste Remoteverbindungszeichenfolge unter SchoolContext , und wählen Sie die Verbindungszeichenfolge für die von Ihnen erstellte Datenbank aus.

  8. Wählen Sie Code First-Migrationen ausführen (wird beim Anwendungsstart ausgeführt).

  9. Deaktivieren Sie Diese Verbindungszeichenfolge zur Laufzeit für userContext (DefaultConnection) verwenden, da diese Anwendung die Mitgliedschaftsdatenbank nicht verwendet.

    Registerkarte

  10. Klicken Sie auf Weiter.

  11. Klicken Sie auf der Registerkarte Vorschau auf Vorschau starten.

    Schaltfläche

    Auf der Registerkarte wird eine Liste der Dateien angezeigt, die auf den Server kopiert werden. Das Anzeigen der Vorschau ist nicht erforderlich, um die Anwendung zu veröffentlichen, ist jedoch eine nützliche Funktion, die Sie beachten sollten. In diesem Fall müssen Sie nichts mit der Liste der angezeigten Dateien tun. Wenn Sie diese Anwendung das nächste Mal bereitstellen, werden nur die Dateien in dieser Liste aufgeführt, die geändert wurden.

    Ausgabe der StartPreview-Datei

  12. Klicken Sie auf Veröffentlichen.
    Visual Studio beginnt mit dem Kopieren der Dateien auf den Windows Azure-Server.

  13. Im Fenster Ausgabe wird angezeigt, welche Bereitstellungsaktionen ausgeführt wurden, und es wird die erfolgreiche Durchführung der Bereitstellung gemeldet.

    Ausgabefenster, in dem eine erfolgreiche Bereitstellung gemeldet wird

  14. Nach erfolgreicher Bereitstellung wird der Standardbrowser automatisch für die URL der bereitgestellten Website geöffnet.
    Die erstellte Anwendung wird nun in der Cloud ausgeführt. Klicken Sie auf die Registerkarte Schüler.

    Students_index_page_with_paging

An diesem Punkt wurde Ihre SchoolContext-Datenbank in der Windows Azure SQL-Datenbank erstellt, da Sie Ausführen Code First-Migrationen (wird bei App-Start ausgeführt) ausgewählt haben. Die Web.config-Datei auf der bereitgestellten Website wurde geändert, sodass der MigrateDatabaseToLatestVersion-Initialisierer beim ersten Lesen oder Schreiben von Daten in der Datenbank ausgeführt wird (was bei der Auswahl der Registerkarte "Kursteilnehmer " der Fall war):

Screenshot des Codes mit hervorgehobener Option

Der Bereitstellungsprozess hat auch eine neue Verbindungszeichenfolge (SchoolContext_DatabasePublish) für Code First-Migrationen erstellt, die zum Aktualisieren des Datenbankschemas und zum Seeding der Datenbank verwendet werden kann.

Database_Publish Verbindungszeichenfolge

Die DefaultConnection-Verbindungszeichenfolge ist für die Mitgliedschaftsdatenbank (die wir in diesem Tutorial nicht verwenden). Die SchoolContext-Verbindungszeichenfolge ist für die ContosoUniversity-Datenbank.

Sie finden die bereitgestellte Version der Web.config-Datei auf Ihrem eigenen Computer in ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. Sie können über FTP auf die bereitgestellteWeb.config-Datei zugreifen. Anweisungen finden Sie unter ASP.NET Webbereitstellung mit Visual Studio: Bereitstellen eines Codeupdates. Befolgen Sie die Anweisungen, die mit "Für die Verwendung eines FTP-Tools benötigen Sie drei Dinge: die FTP-URL, den Benutzernamen und das Kennwort".

Hinweis

Die Web-App implementiert keine Sicherheit, sodass jeder, der die URL findet, die Daten ändern kann. Anweisungen zum Schützen der Website finden Sie unter Bereitstellen einer sicheren ASP.NET MVC-App mit Mitgliedschaft, OAuth und SQL-Datenbank auf einer Windows Azure-Website. Sie können verhindern, dass andere Personen die Website verwenden, indem Sie das Windows Azure-Verwaltungsportal oder server Explorer in Visual Studio verwenden, um die Website zu beenden.

Screenshot: Server Explorer mit erweiterter Registerkarte

Code First-Initialisierer

Im Abschnitt Bereitstellung wurde der Initialisierer MigrateDatabaseToLatestVersion verwendet. Code First bietet auch andere Initialisierer, die Sie verwenden können, einschließlich CreateDatabaseIfNotExists (Standard), DropCreateDatabaseIfModelChanges und DropCreateDatabaseAlways. Der DropCreateAlways Initialisierer kann nützlich sein, um Bedingungen für Komponententests einzurichten. Sie können auch eigene Initialisierer schreiben und einen Initialisierer explizit aufrufen, wenn Sie nicht warten möchten, bis die Anwendung aus der Datenbank liest oder in die Datenbank schreibt. Eine umfassende Erläuterung der Initialisierer finden Sie in Kapitel 6 des Buches Programming Entity Framework: Code First von Julie Lerman und Rowan Miller.

Zusammenfassung

In diesem Tutorial haben Sie erfahren, wie Sie ein Datenmodell erstellen und grundlegende CRUD-, Sortier-, Filter-, Paging- und Gruppierungsfunktionen implementieren. Im nächsten Tutorial beginnen Sie, sich mit erweiterten Themen zu befassen, indem Sie das Datenmodell erweitern.

Links zu anderen Entity Framework-Ressourcen finden Sie in der Inhaltsübersicht ASP.NET Datenzugriff.