Ich habe 2 Modelle:
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
}
public class Order
{
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
Ich möchte Objekte von BEIDEN Klassen in der EINZELNEN Ansicht bearbeiten, daher benötige ich Folgendes:
@model _try2models.Models.Person
@model _try2models.Models.Order
@using(Html.BeginForm())
{
@Html.EditorFor(x => x.PersonID)
@Html.EditorFor(x => x.PersonName)
@Html.EditorFor(x=>x.OrderID)
@Html.EditorFor(x => x.TotalSum)
}
Dies funktioniert natürlich nicht: In einer .cshtml-Datei ist nur eine 'model'-Anweisung zulässig. Möglicherweise gibt es eine Problemumgehung?
asp.net-mvc-3
viewmodel
Smarty
quelle
quelle
ViewBag
mit für jede Ansicht für mich gearbeitet, überprüfen Sie dies , um mehrere Optionen zu kennen, sparte wenig Zeit für mich, anstatt ein Ansichtsmodell oder eine Teilansicht zuAntworten:
Erstellen Sie ein übergeordnetes Ansichtsmodell, das beide Modelle enthält.
Auf diese Weise können Sie zu einem späteren Zeitpunkt mit minimalem Aufwand weitere Modelle hinzufügen.
quelle
Um das Tupel zu verwenden, müssen Sie Folgendes tun: Ändern Sie in der Ansicht das Modell in:
Um @ html-Methoden zu verwenden, müssen Sie Folgendes tun:
oder
Item1 gibt den ersten Parameter an, der an die Tuple-Methode übergeben wurde. Mit Item2 können Sie auf das zweite Modell zugreifen und so weiter.
In Ihrem Controller müssen Sie eine Variable vom Typ Tuple erstellen und diese dann an die Ansicht übergeben:
Ein weiteres Beispiel: Mehrere Modelle in einer Ansicht
quelle
Tuple
in diesem Fall niemals a - OP möchte Daten bearbeiten, und aTuple
hat keinen Standardkonstruktor, sodass das Modell beimEine andere Option, bei der kein benutzerdefiniertes Modell erstellt werden muss, ist die Verwendung eines Tupels <> .
Es ist nicht so sauber wie das Erstellen einer neuen Klasse, die laut Andis Antwort beides enthält, aber es ist realisierbar.
quelle
@model
Zeilen haben?@Model.Item1.Property
und@Model.Item2.Property
fürPerson
undOrder
jeweilsWenn Sie ein Fan von sehr flachen Modellen sind, sollten Sie zur Unterstützung der Ansicht ein Modell erstellen, das für diese bestimmte Ansicht spezifisch ist ...
Viele Benutzer verwenden AutoMapper, um ihre Domänenobjekte ihren flachen Ansichten zuzuordnen.
Die Idee des Ansichtsmodells ist, dass es nur die Ansicht unterstützt - sonst nichts. Sie haben eine pro Ansicht, um sicherzustellen, dass sie nur das enthält, was für diese Ansicht erforderlich ist - nicht viele Eigenschaften, die Sie für andere Ansichten benötigen.
quelle
ok, jeder macht Sinn und ich habe alle Teile genommen und hierher gebracht, um Neulingen wie mir zu helfen, die eine Erklärung von Anfang bis Ende benötigen.
Sie machen Ihre große Klasse, die 2 Klassen enthält, gemäß @ Andrews Antwort.
Dann füllen Sie in Ihrem Controller die 2 Modelle. Manchmal müssen Sie nur eine füllen. In der Rückgabe verweisen Sie dann auf das große Modell und es nimmt die 2 im Inneren mit zur Ansicht.
Oben in der Ansicht
Laden Sie dann Ihre Eingaben oder Anzeigen, die auf den Inhalt der großen Modelle verweisen:
Und. . . Zurück auf der Ranch, wenn die Post hereinkommt, verweisen Sie auf die große Klasse:
und nutzen Sie, was die Modelle zurückgegeben haben:
Haben Sie wahrscheinlich einige DataAnnotation Validation-Inhalte in der Klasse und setzen Sie if (ModelState.IsValid) oben in den Speicher- / Bearbeitungsblock. . .
quelle
Tatsächlich gibt es eine Möglichkeit, zwei oder mehr Modelle in einer Ansicht zu verwenden, ohne sie in eine Klasse einzuschließen, die beide enthält.
Verwenden des Mitarbeiters als Beispielmodell:
Wird eigentlich wie behandelt.
Die View-Methode (Mitarbeiter) setzt Ihr Modell also auf ViewBag und wird dann von ViewEngine umgewandelt.
Dies bedeutet, dass,
Kann verwendet werden wie
Im Wesentlichen können Sie alles, was sich in Ihrem ViewBag befindet, als "Modell" verwenden, da dies sowieso so funktioniert. Ich sage nicht, dass dies architektonisch ideal ist, aber es ist möglich.
quelle
Erstellen Sie einfach ein einzelnes Ansichtsmodell mit allen erforderlichen Informationen. Normalerweise erstelle ich für jede Ansicht ein Modell, damit ich für jede Ansicht spezifisch sein kann, entweder für diese Ansicht, oder ein übergeordnetes Modell erstellen und es erben kann. ODER erstellen Sie ein Modell, das beide Ansichten enthält.
Persönlich würde ich sie nur zu einem Modell hinzufügen, aber so mache ich es:
quelle
Sie können das Präsentationsmuster http://martinfowler.com/eaaDev/PresentationModel.html verwenden
Dieses Präsentationsmodell "Ansicht" kann sowohl Person als auch Reihenfolge enthalten. Diese neue
Klasse kann das Modell sein, auf das Ihre Ansicht verweist.
quelle
Eine andere Möglichkeit, über die nie gesprochen wird, ist das Erstellen einer Ansicht in MSSQL mit allen Daten, die Sie präsentieren möchten. Verwenden Sie dann LINQ to SQL oder was auch immer, um es zuzuordnen. In Ihrem Controller kehren Sie zur Ansicht zurück. Getan.
quelle
Sie können nicht zwei Modelle in einer Ansicht deklarieren. Versuchen Sie,
Html.Action("Person", "[YourController]")
& zu verwendenHtml.Action("Order", "[YourController]")
.Viel Glück.
quelle
Neben einem Ansichtsmodell in asp.net können Sie auch mehrere Teilansichten erstellen und jeder Ansicht eine andere Modellansicht zuweisen, zum Beispiel:
dann eine weitere Teilansicht Modell für Bestellmodell
Laden Sie dann in Ihrer Hauptansicht beide Teilansichten von
quelle
Ich hoffe du findest es hilfreich !!
Ich verwende ViewBag für Projekt und Modell für Aufgabe. Auf diese Weise verwende ich zwei Modelle in einer Ansicht und in der Steuerung. Ich definiere den Wert oder die Daten von ViewBag
und in view tbltask und projectlist sind meine beiden diff modelle
@ {
} @modell List
quelle