Tutorial: Hinzufügen von Sortierung, Filterung und Paging mit dem Entity Framework in einer ASP.NET MVC-Anwendung
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 Schülerindex Sortier-, Filter- und Pagingfunktionen hinzu. Sie erstellen auch eine einfache Gruppierungsseite.
Die folgende Abbildung zeigt, wie die Seite aussieht, wenn Sie fertig sind. 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.
In diesem Tutorial:
- Hinzufügen von Spaltensortierungslinks
- Hinzufügen eines Suchfelds
- Hinzufügen von Paging
- Erstellen einer Infoseite
Voraussetzungen
Hinzufügen von Spaltensortierungslinks
Um die Sortierung zur Seite Student Index 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 Abfragezeichenfolgenwert wird von ASP.NET MVC als Parameter für die Aktionsmethode bereitgestellt. Der Parameter ist eine Zeichenfolge, die entweder "Name" oder "Date" ist, optional gefolgt von einem Unterstrich und der Zeichenfolge "desc", um die absteigende Reihenfolge anzugeben. Standardmäßig wird eine aufsteigende Sortierreihenfolge verwendet.
Bei der ersten Anforderung der Indexseite gibt es keine Abfragezeichenfolge. Die Kursteilnehmer werden in aufsteigender Reihenfolge von LastName
angezeigt. Dies ist der Standardwert, 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<T> Variable vor der switch
-Anweisung, ändert sie in der switch
-Anweisung und ruft die ToList
-Methode nach der -Anweisung auf switch
. 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 ToList
. Daher führt dieser Code zu einer einzelnen Abfrage, die erst mit der return View
-Anweisung ausgeführt wird.
Alternativ zum Schreiben unterschiedlicher LINQ-Anweisungen für jede Sortierreihenfolge können Sie dynamisch eine LINQ-Anweisung erstellen. Informationen zu dynamischem LINQ finden Sie unter Dynamisches LINQ.
Hinzufügen von Links zur Spaltenüberschrift zur Indexansicht "Student"
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 class="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 Hyperlinks 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.
Nachdem Sie auf die Überschrift Nachname geklickt haben, werden die Kursteilnehmer in absteigender Nachnamereihenfolge angezeigt.
Hinzufügen eines Suchfelds
Zum Hinzufügen von Filterung zur Seite Schülerindex fügen Sie der Ansicht ein Textfeld und eine Schaltfläche zum Senden hinzu und nehmen entsprechende Änderungen an der Methode vor Index
. Im Textfeld können Sie eine Zeichenfolge eingeben, nach der in den Feldern Vorname und Nachname gesucht werden soll.
Hinzufügen der Filterfunktion zur Indexmethode
Ersetzen Sie in Controller\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.Contains(searchString) || s.FirstMidName.Contains(searchString)); } 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()); }
Der Code fügt der Index
-Methode einen Parameter hinzusearchString
. Der Zeichenfolgenwert für die Suche wird aus einem Textfeld empfangen, das Sie zur Indexansicht hinzufügen. Außerdem wird der LINQ-Anweisung eine where
Klausel hinzugefügt, die nur Kursteilnehmer auswählt, deren Vorname oder Nachname die Suchzeichenfolge enthält. Die -Anweisung, die die Where -Klausel hinzufügt, wird nur ausgeführt, wenn nach einem Wert gesucht werden muss.
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 (die Where
-Anweisung in einer Anweisung) if
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 Beachtung der Groß-/Kleinschreibung durch. Wenn Sie die ToUpper
-Methode aufrufen, um den Test explizit ohne Groß-/Kleinschreibung zu berücksichtigen, wird daher sichergestellt, dass sich die Ergebnisse nicht ändern, wenn Sie den Code später so ändern, dass er ein Repository verwendet, das anstelle eines Objekts eine IEnumerable
IQueryable
Auflistung 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.)
Die NULL-Behandlung kann sich auch bei verschiedenen Datenbankanbietern oder bei Verwendung eines IQueryable
Objekts im Vergleich zur Verwendung einer IEnumerable
Auflistung unterscheiden. In einigen Szenarios gibt eine Where
Bedingung z. B table.Column != 0
. möglicherweise keine Spalten zurück, die als Wert enthalten null
. Standardmäßig generiert EF zusätzliche SQL-Operatoren, damit die Gleichheit zwischen NULL-Werten in der Datenbank funktioniert, wie sie im Arbeitsspeicher funktioniert. Sie können jedoch das UseDatabaseNullSemantics-Flag in EF6 festlegen oder die UseRelationalNulls-Methode in EF Core aufrufen, um dieses Verhalten zu konfigurieren.
Hinzufügen eines Suchfelds zur Indexansicht "Student"
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.
Beachten Sie, dass die URL nicht die Suchzeichenfolge "an" enthält. Dies bedeutet, dass Sie die gefilterte Liste nicht erhalten, wenn Sie das Lesezeichen verwenden. Dies gilt auch für die Spaltensortierlinks, da sie die gesamte Liste sortieren. Sie ändern die Schaltfläche Suchen weiter unten im Tutorial, um Abfragezeichenfolgen für Filterkriterien zu verwenden.
Hinzufügen von Paging
Um paging zur Indexseite Students 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 Ansicht Paginglinks Index
hinzu. PagedList.Mvc ist eines von vielen guten Paging- und Sortierpaketen für ASP.NET MVC, und seine Verwendung hier ist nur als Beispiel gedacht, nicht als Empfehlung dafür gegenüber anderen Optionen.
Installieren des NuGet-Pakets PagedList.MVC
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
Sammlungen. Die Erweiterungsmethoden erstellen eine einzelne Seite von Daten in einer PagedList
Sammlung aus Ihrem IQueryable
oder, IEnumerable
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ü Extrasdie Option NuGet-Paket-Manager und dann Paket-Manager-Konsole aus.
Stellen Sie im Fenster Paket-Manager-Konsole sicher, dass die Paketquellenuget.org und das StandardprojektContosoUniversity lautet, und geben Sie dann den folgenden Befehl ein:
Install-Package PagedList.Mvc
Erstellen Sie das Projekt.
Hinweis
Das PageList-Paket wird nicht mehr verwaltet. Daher ist es für aktuelle Projekte besser, das X.PagedList-Paket zu verwenden. Der Standard Unterschied besteht darin, dass X.PagedList eine portable Assembly ist. Dies bedeutet, dass das Paket plattformübergreifend ist und sowohl für Webprojekte als auch für andere .NET-Projekte verwendet werden kann. Das neue Paket sollte keine Kompatibilitätsprobleme verursachen, da es seit Version 8.4 auf .NET 6 portiert wurde.
Fügen Sie Pagingfunktionen zur Indexmethode hinzu
Fügen Sie in Controllers\StudentController.cs eine Anweisung für den
PagedList
Namespace hinzuusing
:using PagedList;
Ersetzen Sie die
Index
-Methode durch den 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.Contains(searchString) || s.FirstMidName.Contains(searchString)); } 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: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 Auslagerungs- oder Sortierlink geklickt hat, sind alle Parameter NULL. Wenn auf einen Auslagerungslink geklickt wird, enthält die
page
Variable die anzuzeigende Seitenzahl.Eine
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 dersearchString
Parameter nicht NULL.if (searchString != null) { page = 1; } else { searchString = currentFilter; }
Am Ende der Methode konvertiert die
ToPagedList
Erweiterungsmethode für das Students-ObjektIQueryable
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, dasspage
zurückgegeben wird, wenn dies über einen Wert verfügt, oder 1, wennpage
gleich 0 (null) ist.
Hinzufügen von Paginglinks zur Indexansicht "Student"
Ersetzen Sie in Views\Student\Index.cshtml den vorhandenen Code durch den folgenden Code. Die Änderungen werden hervorgehoben.
@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 class="table"> <tr> <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> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.LastName) </td> <td> @Html.DisplayFor(modelItem => item.FirstMidName) </td> <td> @Html.DisplayFor(modelItem => item.EnrollmentDate) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </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 einPagedList
-Objekt anstelle einesList
-Objekts aufruft.Die
using
Anweisung fürPagedList.Mvc
gewährt Zugriff auf das MVC-Hilfsprogramm für die Pagingschaltflächen.Der Code verwendet eine Überladung von BeginForm , die es ermöglicht, FormMethod.Get anzugeben.
@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 empfehlen, GET zu verwenden, 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 undModel.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.
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.
Erstellen einer Infoseite
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 imHome
Controller. - Ändern Sie die
About
Ansicht.
Erstellen des Ansichtsmodells
Erstellen Sie einen ViewModels-Ordner im Projektordner. Fügen Sie in diesem Ordner die Klassendatei EnrollmentDateGroup.cs hinzu, und ersetzen Sie den Vorlagencode 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 den folgenden Code:public ActionResult About() { IQueryable<EnrollmentDateGroup> 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.ToList()); }
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 Kursteilnehmer für jedes Anmeldedatum wird in einer Tabelle angezeigt.
Abrufen des Codes
Herunterladen des abgeschlossenen Projekts
Zusätzliche Ressourcen
Links zu anderen Entity Framework-Ressourcen finden Sie unter ASP.NET Datenzugriff – Empfohlene Ressourcen.
Nächste Schritte
In diesem Tutorial:
- Hinzufügen von Spaltensortierungslinks
- Hinzufügen eines Suchfelds
- Hinzufügen von Paging
- Erstellen einer Infoseite
Fahren Sie mit dem nächsten Artikel fort, um zu erfahren, wie Sie die Verbindungsresilienz und die Befehlsüberwachung verwenden.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für