Verwenden einer PagedList mit einem ViewModel ASP.Net MVC
Ich versuche, mit einem PagedList in meinem ASP.Net Anwendung fand ich das Beispiel auf der Microsoft-website http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application
Wie ist es möglich, eine PagedList in einer komplexen situation, die nutzt ein ViewModel? Ich versuche, fügen Sie ein PagedList ohne Erfolg, an den Ausbilder Beispiel hier gepostet: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application
Das problem ist, dass das ViewModel besteht aus Klassen und nicht einfach Felder, so kann ich nicht konvertieren Sie das Ergebnis mit dem ToPageList () - Methode.
Dies ist die ViewModel-Struktur:
using System.Collections.Generic;
using ContosoUniversity.Models;
namespace ContosoUniversity.ViewModels
{
public class InstructorIndexData
{
public IEnumerable<Instructor> Instructors { get; set; }
public IEnumerable<Course> Courses { get; set; }
public IEnumerable<Enrollment> Enrollments { get; set; }
}
}
Muss ich join der drei Tabellen in das ViewModel und das Ergebnis in einer View.
InformationsquelleAutor der Frage ltedone | 2014-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für jeden, der versucht, es zu tun, ohne Sie ändern Ihre ViewModels UND nicht geladen werden alle Ihre Einträge aus der Datenbank.
Repository
Controller
Ansicht
Bonus
Tun, oben zuerst, dann vielleicht verwenden Sie diese!
Da diese Frage (view) Modelle, werde ich verschenken eine kleine Lösung für Sie, die nicht nur nützlich sein für die Auslagerungsdatei, aber für den rest der Anwendung, wenn Sie wollen, dass Ihre Entitäten getrennt, nur im repository, und haben den rest der Anwendung mit Modellen (kann verwendet werden als Modelle anzeigen).
Repository
In Ihrer Bestellung repository (in meinem Fall), fügen Sie eine statische Methode zum konvertieren eines Modells:
Unter Ihrem repository-Klasse, fügen Sie diese:
Und dann in Ihre
GetOrderPage
Methode:Lassen Sie mich erklären:
Den statischen
ConvertToModel
Methode zugegriffen werden kann von jedem anderen repository, wie oben verwendet, ich benutzeConvertToModel
von einigenAddressRepository
.Den extension-Klasse/- Methode können Sie konvertieren eine Person zu einem Modell. Dies kann IQueryable oder jede andere Liste, Sammlung.
Nun, hier kommt die Magie: Wenn Sie die Abfrage ausgeführt worden ist, VOR dem Aufruf
SelectOrderModel()
ErweiterungincludeRelations
im inneren der Erweiterung wird wahr sein, weil diesource
ist KEINE Datenbank-Abfrage-Typ (nicht eine linq-to-sqlIQueryable
). Wenn dies wahr ist, die extension kann andere Methoden aufrufen/Erweiterungen in Ihrer Anwendung für die Konvertierung von Modellen.Nun auf der anderen Seite: Sie können zuerst führen Sie die Erweiterung und dann weiterhin tun, LINQ filtern. Das filtern stattfinden wird, in die Datenbank schließlichweil Sie nicht wollen, eine
.ToList()
noch, die Erweiterung ist nur eine Ebene Abwicklung Ihrer Anfragen. Linq-to-sql wird schließlich wissen, welche Filterung angewendet in der Datenbank. DieinlcudeRelations
wird falsch sein, so dass es nicht an andere c# - Methoden, die SQL nicht verstehen.Es sieht zunächst kompliziert, Erweiterungen könnte etwas neues sein, aber es ist wirklich nützlich. Schließlich, wenn Sie für alle Repositorys, einfach ein
.Include()
extra Belastung der Beziehungen.InformationsquelleAutor der Antwort CularBytes
Als Chris schlug vor, den Grund, warum man mit ViewModel nicht verhindern, dass Sie mit
PagedList
.Sie müssen bilden eine Sammlung von der ViewModel-Objekte, die benötigt werden, senden, um die Ansicht für paging über.
Hier ist eine Schritt-für-Schritt-Anleitung, die Sie verwenden können
PagedList
für Ihre viewmodel-Daten.Ihre viewmodel (habe ich ein einfaches Beispiel für die Kürze, und können Sie leicht ändern Sie es an Ihre Bedürfnisse anzupassen.)
und die Index-Methode des Controllers wird so etwas wie
Und den Index-view
Hier ist die SO link mit meiner Antwort, die Schritt für Schritt Anleitung, wie Sie mit
PageList
InformationsquelleAutor der Antwort Dennis R
Modifizierte ich den code wie folgt:
ViewModel
Controller
Ansicht
Ich hoffe, dass dies Ihnen helfen würde!!
InformationsquelleAutor der Antwort ltedone
Ich herausgefunden, wie dies zu tun. Ich war mit dem erstellen einer Anwendung sehr ähnlich wie das Beispiel/tutorial diskutierten Sie in Ihrer ursprünglichen Frage.
Hier ist ein Ausschnitt von dem code, der bei mir funktioniert:
Fügte ich
meinen controller als tutorial Staaten.
Nun meiner Ansicht nach meine mit Aussagen usw. an der Spitze, die NOTE, die ich nicht ändern meine mit Modell-Anweisung.
und dann an die Unterseite zu bauen, meine ausgelagerten Liste ich Folgendes und es scheint zu funktionieren. Ich habe noch nicht gebaut, in der die Funktionalität für die aktuelle Art, die zeigen, personenbezogenen Daten, Filter, etc, aber ich dont denke, es wird schwierig.
Hoffen, dass für Sie arbeitet. Lassen Sie mich wissen, wenn es funktioniert!!
InformationsquelleAutor der Antwort dave317
Die Tatsache, dass Sie bei der Verwendung einer view-Modell keine Berücksichtigung. Der standard-Weg, mit
PagedList
speichern "eine Seite der Elemente" alsViewBag
variable. Alle Sie haben zu bestimmen ist, was die Sammlung ausmacht, was werden Sie paging über. Sie können nicht logisch-Seite mehrere Sammlungen gleichzeitig, so vorausgesetzt, Sie wählteInstructors
:Dann, den rest der standard-code funktioniert wie immer.
InformationsquelleAutor der Antwort Chris Pratt