Mehrere Modelle, die an eine einzelne Sichteninstanz gesendet werden

8

Meine Terminologie ist wahrscheinlich weit weg, aber im Grunde versuche ich, mehrere Datenmodelle an eine Ansicht zu übergeben. Verwenden Sie dieses Beispiel, um die Frage im Zusammenhang zu stellen:

Sagen Sie, ich mache einen Blog. Wenn ich mich anmelde, möchte ich auf dem Startbildschirm eine Liste aller neuen nicht genehmigten Kommentare sowie eine Liste der kürzlich registrierten Benutzer und eine Liste der zuletzt gesendeten Blogposts anzeigen.

Die meisten Diskussionen, die ich gesehen habe, schlagen vor, die Ansichtsseite so einzugeben, dass sie mit "return View (RecentComments)" aufgerufen werden und die Kommentare in der Ansicht durchlaufen oder das Datenmodell wie "var NewUsers" darstellen kann = (MembershipUserCollection) ViewData.Model ". Was ich im Idealfall anstrebe, ist die "richtige" oder zumindest die "richtige" Art, mehrere Modelle zu übertragen, während gleichzeitig eine angemessene logische Trennung beibehalten wird.

    
nathanchere 05.01.2010, 02:30
quelle

8 Antworten

14

Eine Möglichkeit besteht darin, einen neuen Typ zu erstellen, der beide Teile von Modelldaten einkapselt:

%Vor%

Eine andere Möglichkeit besteht darin, die "Haupt" -Modelldaten als stark typisierte Daten zu speichern und andere Daten in den Ansichtsdaten als Wörterbuchelemente zu speichern:

%Vor%

Der Vorteil des zweiten Ansatzes ist, dass Sie nichts besonderes tun müssen: Es funktioniert sofort.

    
Eilon 05.01.2010, 02:47
quelle
8

Was ich in der Vergangenheit gemacht habe, ist eine Klasse geschrieben, die Instanzen beider Klassen enthält, die ich für die Ansicht brauche.

dh

%Vor%

Dann wird Ihre Ansicht stark als Stadt typisiert, und Sie werden Model.TheMall.Property und Model.TheSchool.Property verwenden, um auf Ihre Bedürfnisse zuzugreifen

BEARBEITEN

Dies ist ein Beispiel dafür, was andere Poster bedeuten, indem Sie ein Objekt mit beiden Objekten als fields / properties

erstellen     
splatto 05.01.2010 02:48
quelle
3

Leider besteht die einzige Möglichkeit, mehrere Objekte zu übergeben, entweder darin, ein Objekt mit beiden Objekten als fields / properties zu erstellen oder mit einem schwach typisierten Array.

    
David Pfeffer 05.01.2010 02:46
quelle
3

Um mehrere Modelle an eine Ansicht zu übergeben, müssen Sie ein Formularansichtsmodell erstellen, in dem sich Ihre anderen Modelle befinden.

Dann können Sie Ihrer Ansicht nach die einzelnen Modelle in Ihrem Formularansichtsmodell an die Teilansichten übergeben, die für das Rendern der Daten in diesen Modellen zuständig sind.

Macht Sinn?

Bearbeiten

Übrigens: Ein Formularsichtmodell ist einfach eine Klasse. Es ist kein spezieller Typ, wie es in meiner Antwort vorgeschlagen wurde.

    
griegs 05.01.2010 02:47
quelle
2

Zusätzlich zu meiner anderen Antwort wäre eine andere Möglichkeit, die Ansichts- und Masterseiten in der Seitendirektive nicht stark zu typisieren, sondern stattdessen die generischen typbasierten ViewData-Erweiterungen von MVC Contrib . Diese Erweiterungen verwenden grundsätzlich den vollständig qualifizierten Typnamen als ViewData-Wörterbuchschlüssel. Effektiv sind die Typisierungsvorteile die gleichen wie beim stark typisierten Seitenansatz, mit weniger Klassenaufwand im Hinblick auf die Anzahl der erforderlichen Ansichtsmodellklassen. Dann in Ihren Aktionen tun Sie

%Vor%

und in den Ansichten, die du machst

%Vor%

und auf der Masterseite tun Sie

%Vor%

Sie können diese Get & lt; & gt; ruft in den Ansichten Inline auf, um die Kosten für mehrfaches Casting zu verringern.

    
G-Wiz 05.01.2010 21:07
quelle
1

Nachdem ich an einer großen ASP.NET MVC-App gearbeitet hatte, fand ich den Ansatz, der am produktivsten war, während die Minimierung des Laufzeitcastings auf der Verwendung von Generics basierte, um die verschachtelte Struktur von Ansichten nachzuahmen. Im Wesentlichen erhalten Ansichten ihren eigenen Datentyp. In der Regel sind dies Domänenobjekte oder Sammlungen von Domänenobjekten, die Metadaten enthalten. Generische Versionen dieser Typen sind auf allen möglichen Masterseiten verfügbar und verwenden einen Typparameter, der Daten definiert, die für die Masterseite relevant sind.

%Vor%

Es ist auch möglich, die generische Eigenschaft zu invertieren, aber da die Ansicht das Layout diktiert, sollten die Ansichtsdaten meiner Meinung nach die Layoutdaten dominieren. LayoutA.master würde von ViewMasterPage<ILayoutModel<LayoutAData>> abgeleitet und LayoutB.master würde von ViewMasterPage<ILayoutModel<LayoutBData>> abgeleitet werden. Dies hält die Ansichtsdaten und die Layoutdaten in konsistenter, stark typisierter und flexibler Weise getrennt.

    
G-Wiz 05.01.2010 20:03
quelle
1

Das Erstellen eines Objekts, das Ihre anderen Objekte einkapseln kann, ist der beste Weg. Ansonsten stecken Sie im Controller und in der Ansicht mit einer Reihe hässlicher ViewData-Tags fest.

    
user973281 30.09.2011 14:39
quelle
1

Eine Sache, die niemand erwähnt zu haben scheint, ist, dass es im ursprünglichen Beispiel der Fragesteller sinnvoll sein könnte, die Ansicht aus einer Reihe von Kindaktionen zu erstellen, die mit ihrem eigenen Funktionsbereich umgehen, anstatt ein Mega-View-Modell zu erstellen. Auf diese Weise können die Komponenten wie nicht freigegebene Nachrichten usw. wiederverwendet werden.

Dies ergibt auch eine bessere Kapselung.

    
DanH 16.01.2012 00:38
quelle

Tags und Links