Je veux avoir 2 modèles dans une vue. La page contient à la fois LoginViewModel
et RegisterViewModel
.
par exemple
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; }
}
Dois-je créer un autre ViewModel contenant ces 2 ViewModels?
public BigViewModel
{
public LoginViewModel LoginViewModel{get; set;}
public RegisterViewModel RegisterViewModel {get; set;}
}
J'ai besoin que les attributs de validation soient avancés dans la vue. C'est pourquoi j'ai besoin des ViewModels.
N'y a-t-il pas un autre moyen tel que (sans le 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
la source
la source
ViewBag
avec pour chacun dans la vue, fonctionne très bien@
en face de son nom, comme je l'ai fait ici.Réponses:
Il y a beaucoup de façons...
avec votre BigViewModel vous faites:
vous pouvez créer 2 vues supplémentaires
Login.cshtml
et register.cshtml même chose
après la création, vous devez les rendre dans la vue principale et leur passer le viewmodel / viewdata
donc ça pourrait être comme ça:
ou
utiliser des parties ajax de votre site Web devient plus indépendant
iframes
, mais ce n'est probablement pas le casla source
@Html.RenderAction
signale une erreur indiquant que l' expression doit renvoyer une valeurJe recommanderais d'utiliser
Html.RenderAction
et PartialViewResults pour accomplir cela; il vous permettra d'afficher les mêmes données, mais chaque vue partielle aurait toujours un modèle de vue unique et supprime le besoin d'unBigViewModel
Votre vue contient donc quelque chose comme ceci:
Où
Login
etRegister
les deux actions de votre contrôleur sont-elles définies comme suit:Le
Login
&Register
serait alors des contrôles utilisateur résidant soit dans le dossier View actuel, soit dans le dossier Shared et voudrait quelque chose comme ceci:/Views/Shared/Login.cshtml: (ou /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (ou /Views/MyView/Register.cshtml)
Et là, vous avez une seule action de contrôleur, affichez et affichez le fichier pour chaque action, chacune étant totalement distincte et ne dépendant les unes des autres pour rien.
la source
RenderAction
. J'oublie toujours sa partie du pack futures car mon projet inclut toujours cette DLL par défaut. C'est vraiment à la préférence et aux exigences d'application de savoir si les cycles mvc supplémentaires valent la séparation qu'il donne du côté de la conception. Souvent, vous pouvez mettre en cache lesRenderAction
résultats, donc le seul coup que vous prenez est le léger traitement supplémentaire via l'usine du contrôleur.Une autre façon consiste à utiliser:
J'ai expliqué comment utiliser cette méthode à la fois dans la vue et le contrôleur pour un autre exemple: Deux modèles dans une vue dans ASP MVC 3
Dans votre cas, vous pouvez l'implémenter en utilisant le code suivant:
Dans la vue:
Notez que j'ai modifié manuellement les attributs de nom pour chaque propriété lors de la création du formulaire. Cela doit être fait, sinon cela ne serait pas correctement mappé au paramètre de type du modèle de la méthode lorsque les valeurs sont envoyées à la méthode associée pour le traitement. Je suggère d'utiliser des méthodes distinctes pour traiter ces formulaires séparément, pour cet exemple, j'ai utilisé les méthodes Login1 et Login2. La méthode Login1 nécessite d'avoir un paramètre de type RegisterViewModel et Login2 nécessite un paramètre de type LoginViewModel.
si un lien d'action est requis, vous pouvez utiliser:
dans la méthode du contrôleur pour la vue, une variable de type Tuple doit être créée puis transmise à la vue.
Exemple:
ou vous pouvez remplir les deux instances de LoginViewModel et RegisterViewModel avec des valeurs, puis les transmettre à la vue.
la source
EditorFor
ouHiddenFor
(ce qui est idéalement ce que je veux utiliser), les propriétés du modèle ne sont pas définies lorsque les méthodesLogin1
/Login2
controller sont appelées. Vraisemblablement, le@Name=
mappage est ignoré. NécessiteHiddenFor
une autre astuce pour cette situation?Utilisez un modèle de vue qui contient plusieurs modèles de vue:
À votre avis:
la source
Réponse: non
Oui , vous pouvez utiliser Tuple (apporte de la magie en ayant plusieurs modèles).
Code:
la source
Ajoutez ce ModelCollection.cs à vos modèles
Manette:
La vue:
la source
un moyen simple de le faire
nous pouvons appeler tous les modèles en premier
puis envoyez votre modèle avec viewbag
et en vue
puis utilisez facilement ce modèle
la source
Mon conseil est de faire un modèle à grande vue:
Dans votre Index.cshtml, si par exemple vous avez 2 partiels:
et dans le contrôleur:
la source
Je veux dire que ma solution était comme la réponse fournie sur cette page stackoverflow: ASP.NET MVC 4, plusieurs modèles dans une vue?
Cependant, dans mon cas, la requête linq qu'ils ont utilisée dans leur contrôleur n'a pas fonctionné pour moi.
Ceci est dit requête:
Par conséquent, "à votre avis, spécifiez simplement que vous utilisez une collection de modèles de vue" n'a pas fonctionné pour moi non plus.
Cependant, une légère variation sur cette solution a fonctionné pour moi. Voici ma solution au cas où cela aiderait quelqu'un.
Voici mon modèle de vue dans lequel je sais que je n'aurai qu'une seule équipe mais cette équipe peut avoir plusieurs cartes (et j'ai un dossier ViewModels dans mon dossier Models btw, d'où l'espace de noms):
Maintenant, c'est mon contrôleur. C'est la différence la plus significative par rapport à la solution du lien référencé ci-dessus. Je construis le ViewModel pour envoyer à la vue différemment.
À mon avis, je ne le spécifie pas en tant que liste. Je fais juste "@model TaskBoard.Models.ViewModels.TeamBoards" Ensuite, j'ai seulement besoin d'un pour chacun lorsque j'itère sur les tableaux de l'équipe. Voici mon point de vue:
Je suis assez nouveau sur ASP.NET MVC, donc cela m'a pris un peu de temps pour comprendre cela. Donc, j'espère que ce message aidera quelqu'un à comprendre son projet dans un délai plus court. :-)
la source
vous pouvez toujours passer le deuxième objet dans un ViewBag ou View Data.
la source
Créez une nouvelle classe dans votre modèle et les propriétés de
LoginViewModel
etRegisterViewModel
:Utilisez ensuite
UserDefinedModel
dans votre vue.la source
Il s'agit d'un exemple simplifié avec IEnumerable.
J'utilisais deux modèles dans la vue: un formulaire avec des critères de recherche (modèle SearchParams) et une grille de résultats, et j'ai eu du mal à ajouter le modèle IEnumerable et l'autre modèle sur la même vue. Voici ce que j'ai trouvé, j'espère que cela aide quelqu'un:
...)
SearchViewModel.cs:
DelegateController.cs:
SearchParamsViewModel.cs:
la source