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.
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.
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
erstellenLeider 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.
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.
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.
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.
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.
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.
Tags und Links asp.net-mvc asp.net model