Chcę mieć 2 modele w jednym widoku. Strona zawiera zarówno LoginViewModel
i RegisterViewModel
.
na przykład
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; }
}
Czy muszę utworzyć kolejny ViewModel, który będzie zawierał te 2 modele ViewModel?
public BigViewModel
{
public LoginViewModel LoginViewModel{get; set;}
public RegisterViewModel RegisterViewModel {get; set;}
}
Potrzebuję atrybutów sprawdzania poprawności, aby przejść do widoku. Właśnie dlatego potrzebuję ViewModels.
Czy nie ma innego sposobu, jak (bez 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
źródło
źródło
ViewBag
dla każdego w widoku, działa świetnie@
podać jego nazwisko, tak jak ja tutaj.Odpowiedzi:
Istnieje wiele sposobów ...
z BigViewModel robisz:
możesz utworzyć 2 dodatkowe widoki
Login.cshtml
i register.cshtml to samo
po utworzeniu musisz wyrenderować je w widoku głównym i przekazać im viewmodel / viewdata
więc może być tak:
lub
korzystanie z części ajax Twojej witryny staje się bardziej niezależne
iframes
, ale prawdopodobnie tak nie jestźródło
@Html.RenderAction
zgłasza błąd, że wyrażenie musi zwrócić wartośćW tym celu zaleciłbym użycie
Html.RenderAction
i PartialViewResults; pozwoli ci wyświetlać te same dane, ale każdy widok częściowy nadal będzie miał jeden model widoku i eliminuje potrzebę korzystania z niegoBigViewModel
Twój widok zawiera więc coś takiego:
Gdzie
Login
iRegister
są obie akcje w twoim kontrolerze zdefiniowane w następujący sposób:Wówczas
Login
&Register
byłyby elementami sterującymi użytkownika znajdującymi się w bieżącym folderze Widok lub w folderze współdzielonym i chcieliby coś takiego:/Views/Shared/Login.cshtml: (lub /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (lub /Views/MyView/Register.cshtml)
I tam masz jedną akcję kontrolera, przeglądaj i przeglądaj plik dla każdej akcji z każdą całkowicie odrębną i nie zależną od siebie w niczym.
źródło
RenderAction
. Zawsze zapominam o jego części pakietu futures, ponieważ mój projekt zawsze domyślnie zawiera tę bibliotekę DLL. To naprawdę zależy od preferencji i wymagań aplikacyjnych, czy dodatkowe cykle mvc są warte rozdzielenia, które daje po stronie projektowania. Wiele razy możesz buforowaćRenderAction
wyniki, więc jedynym trafieniem jest niewielkie dodatkowe przetwarzanie przez fabrykę kontrolera.Innym sposobem jest użycie:
Wyjaśniłem, jak używać tej metody zarówno w widoku, jak i kontrolerze na inny przykład: Dwa modele w jednym widoku w ASP MVC 3
W twoim przypadku możesz go zaimplementować za pomocą następującego kodu:
W widoku:
Zauważ , że ręcznie zmieniłem atrybuty Nazwa dla każdej właściwości podczas budowania formularza. Trzeba to zrobić, w przeciwnym razie nie zostałby poprawnie odwzorowany na parametr metody typu modelu, gdy wartości są wysyłane do powiązanej metody przetwarzania. Sugerowałbym użycie osobnych metod do osobnego przetwarzania tych formularzy, w tym przykładzie użyłem metod Login1 i Login2. Metoda Login1 wymaga parametru typu RegisterViewModel, a Login2 wymaga parametru typu LoginViewModel.
jeśli wymagany jest link akcji, możesz użyć:
w metodzie kontrolera dla widoku należy utworzyć zmienną typu Tuple, a następnie przekazać ją do widoku.
Przykład:
lub możesz wypełnić dwa wystąpienia LoginViewModel i RegisterViewModel wartościami, a następnie przekazać je do widoku.
źródło
EditorFor
lubHiddenFor
(co jest dokładnie tym, czego chcę użyć), właściwości modelu nie są ustawione, gdy wywoływane są metodyLogin1
/Login2
controller. Przypuszczalnie@Name=
mapowanie jest ignorowane. CzyHiddenFor
wymaga innej sztuczki w tej sytuacji?Użyj modelu widoku zawierającego wiele modeli widoku:
Twoim zdaniem:
źródło
Odpowiedź: Nie
Tak , możesz użyć Tuple (pokazuje magię, mając wiele modeli).
Kod:
źródło
Dodaj ten ModelCollection.cs do swoich modeli
Kontroler:
Widok:
źródło
prosty sposób na zrobienie tego
najpierw możemy zadzwonić do wszystkich modeli
następnie wyślij swój model z viewbag
i na widoku
następnie łatwo użyj tego jak Model
źródło
Radzę zrobić model z dużym widokiem:
W pliku Index.cshtml, jeśli na przykład masz 2 częściowe:
i w kontrolerze:
źródło
Chcę powiedzieć, że moje rozwiązanie było jak odpowiedź podana na tej stronie przepływu stosu : ASP.NET MVC 4, wiele modeli w jednym widoku?
Jednak w moim przypadku zapytanie linq użyte w kontrolerze nie działało dla mnie.
To jest powiedziane zapytanie:
W związku z tym „w twoim widoku po prostu określ, że korzystasz z kolekcji modeli widoków” również dla mnie nie działało.
Jednak niewielka zmiana tego rozwiązania zadziałała dla mnie. Oto moje rozwiązanie na wypadek, gdyby komukolwiek to pomogło.
Oto mój model widoku, w którym wiem, że będę miał tylko jeden zespół, ale ten zespół może mieć wiele tablic (i mam folder ViewModels w moim folderze Modele btw, stąd przestrzeń nazw):
To jest mój kontroler. Jest to najbardziej znacząca różnica w stosunku do rozwiązania w linku, o którym mowa powyżej. Buduję ViewModel, aby wysyłać do widoku inaczej.
Moim zdaniem nie określam go jako listy. Po prostu wykonuję „@model TaskBoard.Models.ViewModels.TeamBoards”. Potrzebuję tylko dla każdego, gdy iteruję po deskach zespołu. Oto mój pogląd:
Jestem dość nowy w ASP.NET MVC, więc zrozumienie tego zajęło mi trochę czasu. Mam więc nadzieję, że ten post pomoże komuś w znalezieniu projektu w krótszym czasie. :-)
źródło
zawsze możesz przekazać drugi obiekt w ViewBag lub View Data.
źródło
Stwórz jedną nową klasę w modelu i właściwości
LoginViewModel
orazRegisterViewModel
:Następnie użyj
UserDefinedModel
w swoim widoku.źródło
To jest uproszczony przykład z IEnumerable.
Korzystałem z dwóch modeli w widoku: formularza z kryteriami wyszukiwania (model SearchParams) i siatki wyników, i miałem problem z dodaniem modelu IEnumerable i drugiego modelu do tego samego widoku. Oto, co wymyśliłem, mam nadzieję, że to komuś pomoże:
...)
SearchViewModel.cs:
DelegateController.cs:
SearchParamsViewModel.cs:
źródło