2017-08-01 5 views
0

Nach dem, was ich gelesen habe, soll ich ViewModels verwenden, um meine Ansichten in MVC, anstatt das Modell direkt zu füllen. Dadurch kann ich nicht nur den Inhalt des Modells, sondern auch andere Informationen wie den Anmeldestatus usw. an die Ansicht übergeben, anstatt ViewBag oder ViewData zu verwenden. Ich habe die Tutorials verfolgt und sowohl ein Modell als auch ein Viewmodel erfolgreich an die View gesendet. Das ursprüngliche Problem, das ich hatte, war, dass ich eine paginierte Ansicht benötigte, was einfach ist, wenn man ein Modell alleine passiert, aber schwierig wird, wenn man ein Ansichtsmodell passiert.Wie umgehe ich die Einschränkungen dessen, was MVC-CORE-Controller an die Ansicht weitergeben können?

Mit einem Modell der

public class Instructor { 
    public string forename { get; set; } 
    public string surname { get; set; } 
} 

und ein Ansichtsmodell von

public class InstructorVM { 
    public Instructor Instructors { get; set; } 
    public string LoggedIn { get; set; } 
} 

ich das reine Modell Instructor eine paginierte Liste der Lehrer schaffen kann, aber ich kann nicht InstructorVM zur Ansicht übergeben und paginieren Sie es, da es andere Eigenschaften gibt, die in der Paginierung LoggedIn nicht erforderlich sind. Wenn ich InstructorVM.Instructors an die Ansicht übergebe, bekomme ich die Paginierung, aber bekomme nicht die LoggedIn und da dies nur das Modell ist, habe ich das wohl direkt durchgegangen.

Eine Alternative, die vorgeschlagen wurde, war das Viewmodel in eine Liste zu konvertieren/erweitern, etc. zu jagen, die ein Objekt wie diese erzeugen würde, das die Ansicht

instructor.forename = "dave", instructor.surname = "smith", LoggedIn="Hello brian" 
instructor.forename = "alan", instructor.surname = "jones", LoggedIn="Hello brian" 
instructor.forename = "paul", instructor.surname = "barns", LoggedIn="Hello brian" 

wo der LoggedIn Wert in jeder Zeile wiederholt wird, übergeben wird und dann in der Zeile abgerufen wird Model[0].LoggedIn

Offensichtlich ist dieses Problem verursacht, weil Sie nur ein Objekt passieren kann wieder von einem Verfahren, entweder Instructor, InstructorVM, List<InstructorVM> usw.

Ich versuche herauszufinden, die beste Option, um mir Paginierung (auf einen Teil des zurückgegebenen Objekts) von einem Viewmodel geben, während nicht alles andere im Viewmodel repliziert.

Ein Vorschlag war, ein JavaScript-Framework wie React/Angular zu verwenden, um die Seite in eine MVVM-Art der Dinge zu zerlegen, das Problem ist, dass trotz der Suche nach Vorschlägen und Lesen 1001 "Best JS-Framework" Listen über Google, sie alle gehen davon aus, dass ich bereits alle Frameworks erlernt habe und somit aus den verfügbaren Optionen den am besten geeigneten auswählen können.

Wenn alles, was ich tun möchte, zeigt eine Zeichenfolge und eine paginierte Liste aus einem Ansichtsmodell in einer Ansicht. An diesem Punkt ist es mir egal, wie, es ist mir egal, ob ich ein JS-Framework lernen muss oder ob ich es nur mit MVC-Core machen kann, aber kann mir jemand sagen, wie ich das machen kann, was ich einfach machen kann ASP.NET? Wenn es ein "JS-Framework" ist, welches? Danke

Antwort

0

Ich bin nicht genau sicher, was die Schwierigkeit hier ist, wie Seitenumbruch und die Verwendung eines Ansichtsmodells nicht Faktoren sind, die aufeinander spielen. Beim Paginieren wird nur eine Teilmenge von Elementen aus einem Datenspeicher ausgewählt. Dies geschieht ausschließlich in der ursprünglichen Abfrage.nur

var widgets = db.Widgets.Skip((pageNumber - 1) * itemsPerPage).Take(itemsPerPage).ToList(); 

Blick Modell ist nur eine Schicht auf dieser, wo man dann: Zum Beispiel haben während Sie ursprünglich etwas getan könnte:

var widgets = db.Widgets.ToList(); 

Stattdessen würden Sie so etwas wie Karte der abgefragten Daten, egal, was es auf Instanzen Ihrer Ansicht Modell ist:

var widgetViewModels = widgets.Select(w => new WidgetViewModel 
{ 
    ... 
}); 

Wenn Sie eine Bibliothek wie PagedList oder ähnliches verwenden, kann dieses Verhalten nicht sein immedia Offensichtlich, da die Standardimplementierung davon abhängt, Zugriff auf das Abfrage-Set zu haben (um die Sprung/Take-Logik für Sie auszuführen). Allerdings PagedList zum Beispiel hat StaticPagedList, die Sie eine IPagedList Instanz mit einem bestehenden Datensatz erstellen kann:

var pagedWidgets = new StaticPagedList<WidgetViewModel>(widgetViewModels, pageNumber, itemsPerPage, totalItems); 

Es ist der einzige Teil, das Sie fehlen würde, ist totalItems, die eine zusätzliche Abfrage der Anzahl erfordern wird auf dem ungefilterten Abfrage-Set.

Wenn Sie eine andere Bibliothek verwenden, sollte eine ähnliche Funktion verfügbar sein. Sie müssen sich nur mit der Dokumentation befassen.

+0

Ich habe die Microsoft-Dokumentation von https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro durchlaufen und deshalb bin ich hier gelandet. Gemäß ihrem Beispiel erfolgt die Paginierung im Backend-Controller, wobei die relevante paginierte Teilmenge der Daten des Modell-Instruktors oder die Daten des View-Modells "InstructorVM.Instructor" vom Controller an die Ansicht übergeben werden. Die Übergabe des paginierbaren Teils des Viewmodels 'InstructorVM.Instructor' vom Controller zur Ansicht verliert die anderen Eigenschaften des Viewmodels, in diesem Beispiel' LoggedIn' – Glyn

+0

Die Seitennummerierung betrifft Teilmengen von Daten, ja, ich weiß, dass mein Problem nicht die Seitennummerierung ist Es werden das Ansichtsmodell, die paginierte Teilmenge und alle anderen Eigenschaften für die Ansicht bereitgestellt, was die Dokumentation nicht tut. Und andere Beispiele sind ähnlich, paginate-a-model/don't-paginate-a-viewmodel, daher bin ich hier – Glyn

Verwandte Themen