Ich möchte 2 Modelle in einer Ansicht haben. Die Seite enthält sowohl LoginViewModel
und RegisterViewModel
.
z.B
public class LoginViewModel
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RegisterViewModel
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
Muss ich ein anderes ViewModel erstellen, das diese 2 ViewModels enthält?
public BigViewModel
{
public LoginViewModel LoginViewModel{get; set;}
public RegisterViewModel RegisterViewModel {get; set;}
}
Ich möchte, dass die Validierungsattribute in die Ansicht übernommen werden. Deshalb brauche ich die ViewModels.
Gibt es nicht einen anderen Weg wie (ohne BigViewModel
):
@model ViewModel.RegisterViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Name)
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
@model ViewModel.LoginViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
asp.net-mvc
asp.net-mvc-3
Shawn Mclean
quelle
quelle
ViewBag
für jeden in der Ansicht verwendet, funktioniert@
wie hier vor seinen Namen setzen .Antworten:
Es gibt viele Möglichkeiten ...
Mit Ihrem BigViewModel machen Sie:
Sie können 2 zusätzliche Ansichten erstellen
Login.cshtml
und register.cshtml dasselbe
Nach der Erstellung müssen Sie sie in der Hauptansicht rendern und ihnen das Ansichtsmodell / die Ansichtsdaten übergeben
so könnte es sein:
oder
Die Verwendung von Ajax-Teilen Ihrer Website wird unabhängiger
iframes
, aber wahrscheinlich ist dies nicht der Fallquelle
@Html.RenderAction
einen Fehler, dass Expression einen Wert zurückgeben mussIch würde empfehlen,
Html.RenderAction
PartialViewResults zu verwenden, um dies zu erreichen. Sie können dieselben Daten anzeigen, aber jede Teilansicht verfügt weiterhin über ein einzelnes Ansichtsmodell, sodass keine erforderlich istBigViewModel
Ihre Ansicht enthält also ungefähr Folgendes:
Wo
Login
&Register
sind beide Aktionen in Ihrem Controller wie folgt definiert:Das
Login
&Register
wäre dann ein Benutzersteuerelement, das sich entweder im aktuellen Ansichtsordner oder im freigegebenen Ordner befindet, und möchte Folgendes:/Views/Shared/Login.cshtml: (oder /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (oder /Views/MyView/Register.cshtml)
Und dort haben Sie eine einzelne Controller-Aktion, Ansicht und Ansichtsdatei für jede Aktion, wobei jede Aktion völlig unterschiedlich ist und für nichts voneinander abhängig ist.
quelle
RenderAction
. Ich vergesse immer seinen Teil des Futures-Pakets, da mein Projekt standardmäßig immer diese DLL enthält. Es hängt wirklich von den Präferenz- und Anwendungsanforderungen ab, ob die zusätzlichen MVC-Zyklen die Trennung wert sind, die sie auf der Entwurfsseite geben. Oft können Sie dieRenderAction
Ergebnisse zwischenspeichern, sodass der einzige Treffer, den Sie erzielen, die geringfügige zusätzliche Verarbeitung über die Controller-Factory ist.Ein anderer Weg ist zu verwenden:
Ich habe für ein anderes Beispiel erklärt, wie diese Methode sowohl in der Ansicht als auch im Controller verwendet wird: Zwei Modelle in einer Ansicht in ASP MVC 3
In Ihrem Fall können Sie es mit dem folgenden Code implementieren:
In der Ansicht:
Beachten Sie, dass ich die Namensattribute für jede Eigenschaft beim Erstellen des Formulars manuell geändert habe. Dies muss durchgeführt werden, da es sonst nicht ordnungsgemäß dem Parameter des Methodenmodells der Methode zugeordnet wird, wenn Werte zur Verarbeitung an die zugehörige Methode gesendet werden. Ich würde vorschlagen, separate Methoden zu verwenden, um diese Formulare separat zu verarbeiten. In diesem Beispiel habe ich die Methoden Login1 und Login2 verwendet. Für die Login1-Methode muss ein Parameter vom Typ RegisterViewModel und für Login2 ein Parameter vom Typ LoginViewModel erforderlich sein.
Wenn ein Aktionslink erforderlich ist, können Sie Folgendes verwenden:
In der Methode des Controllers für die Ansicht muss eine Variable vom Typ Tuple erstellt und dann an die Ansicht übergeben werden.
Beispiel:
Oder Sie können die beiden Instanzen von LoginViewModel und RegisterViewModel mit Werten füllen und diese dann an die Ansicht übergeben.
quelle
EditorFor
oderHiddenFor
(was idealerweise das ist, was ich verwenden möchte) verwende, werden die Modelleigenschaften nicht festgelegt, wenn dieLogin1
/Login2
controller-Methoden aufgerufen werden. Vermutlich wird das@Name=
Mapping ignoriert. Benötigt manHiddenFor
für diese Situation einen anderen Trick?Verwenden Sie ein Ansichtsmodell, das mehrere Ansichtsmodelle enthält:
Aus Ihrer Sicht:
quelle
Antwort: Nein
Ja , Sie können Tupel verwenden (bringt Magie in Sicht, wenn Sie mehrere Modelle haben).
Code:
quelle
Fügen Sie diese ModelCollection.cs Ihren Modellen hinzu
Regler:
Die Aussicht:
quelle
ein einfacher Weg, das zu tun
Wir können alle Modelle zuerst aufrufen
Dann senden Sie Ihr Modell mit Viewbag
und im Blick
Verwenden Sie dann einfach dieses Modell
quelle
Mein Rat ist, ein großes Ansichtsmodell zu erstellen:
Wenn Sie in Ihrer Index.cshtml beispielsweise zwei Teiltöne haben:
und im Controller:
quelle
Ich möchte sagen, dass meine Lösung der Antwort auf dieser Stapelüberlaufseite entsprach: ASP.NET MVC 4, mehrere Modelle in einer Ansicht?
In meinem Fall funktionierte die in ihrem Controller verwendete Linq-Abfrage jedoch nicht für mich.
Dies ist die Abfrage:
Folglich hat "in Ihrer Ansicht nur angeben, dass Sie eine Sammlung von Ansichtsmodellen verwenden" auch bei mir nicht funktioniert.
Eine geringfügige Abweichung von dieser Lösung hat bei mir jedoch funktioniert. Hier ist meine Lösung für den Fall, dass dies jemandem hilft.
Hier ist mein Ansichtsmodell, in dem ich weiß, dass ich nur ein Team haben werde, aber dieses Team möglicherweise mehrere Boards hat (und ich habe übrigens einen ViewModels-Ordner in meinem Models-Ordner, daher der Namespace):
Das ist mein Controller. Dies ist der bedeutendste Unterschied zur Lösung in dem oben genannten Link. Ich baue das ViewModel aus, um es anders an die Ansicht zu senden.
Dann spezifiziere ich es meiner Ansicht nach nicht als Liste. Ich mache einfach "@model TaskBoard.Models.ViewModels.TeamBoards". Dann brauche ich nur eine für jede, wenn ich über die Boards des Teams iteriere. Hier ist meine Ansicht:
Ich bin ziemlich neu in ASP.NET MVC, daher habe ich eine Weile gebraucht, um dies herauszufinden. Ich hoffe, dieser Beitrag hilft jemandem, es in kürzerer Zeit für sein Projekt herauszufinden. :-)
quelle
Sie können das zweite Objekt jederzeit in einem ViewBag oder View Data übergeben.
quelle
Erstellen Sie eine neue Klasse in Ihrem Modell und den Eigenschaften von
LoginViewModel
undRegisterViewModel
:Dann verwenden Sie
UserDefinedModel
in Ihrer Ansicht.quelle
Dies ist ein vereinfachtes Beispiel mit IEnumerable.
Ich habe zwei Modelle in der Ansicht verwendet: ein Formular mit Suchkriterien (SearchParams-Modell) und ein Raster für Ergebnisse, und ich hatte Probleme damit, das IEnumerable-Modell und das andere Modell in derselben Ansicht hinzuzufügen. Folgendes habe ich mir ausgedacht, hoffe, das hilft jemandem:
...)
SearchViewModel.cs:
DelegateController.cs:
SearchParamsViewModel.cs:
quelle