"N'hésitez pas à modifier le titre s'il est trompeur, car je ne suis pas sûr que ce soit la bonne façon de le demander"
Je suis nouveau sur ASP.MVC que je rencontre un problème apparemment facile et ayant du mal à le faire.
Ce que j'essaie de faire: J'ai deux ensembles d'échafaudages: vue A, contrôleur A, modèle B. et Vue B, contrôleur B, modèle B.
Le contrôleur A ressemble à ceci:
public ActionResult Initiate(FormCollection formValues, string phone, string method)
{
var ModelB = new ModelB();
var ModelA = new ModelA(); ---> This is null.
ModelB.Email = ModelA.EmailAddress --> This is null.
var userId = ModelB.dosomething(ModelB.Email, phone, method);
}
Je veux passer ceci formValues ["EmailAddress"] du contrôleur A au contrôleur B.
Dans le contrôleur B:
public ActionResult LogIn(FormCollection formValues)
{
ModelA Model = new ModelA();
Model.EmailAddress = formValues["EmailAddress"];
}
Est-il possible de faire ça?
3 Réponses :
Enregistrez le modèle dans TempData dans le contrôleur A comme ceci
TempData.Keep();
et ensuite vous pouvez y accéder dans le contrôleur B comme ceci
ModelA modelA= TempData["ModelA"] as ModelA;
Cependant TempData a une durée de vie très courte et ne peut pas être utilisé dans les demandes suivantes pour garder le TempData persistant pour les demandes ultérieures, vous pouvez utiliser
ModelA Model = new ModelA(); Model.EmailAddress = formValues["EmailAddress"]; TempData["ModelA"]=Model;
Vous devez expliquer que les valeurs TempData ont une durée de vie très courte
est-ce le seul moyen d'ASP.MVC? semble un peu hacky. Existe-t-il une approche qui convient aux parieurs dans le flux MVC?
Si la logique de ModelA et ModelB doit être imbriquée, je recommanderais de créer un nouveau ViewModel, View et Controller:
ModelAB
public ActionResult LogInAndInitiate(FormCollection formValues, string phone, string method)
{
var ModelB = new ModelB();
var ModelA = new ModelA(); // passed in, so its not null!
ModelA.EmailAddress = formValues["EmailAddress"];
ModelB.Email = ModelA.EmailAddress // passed in too!
var userId = ModelB.dosomething(ModelB.Email, phone, method);
}
Si les actions du contrôleur sont totalement indépendantes (c'est-à-dire qu'elles ne s'appellent pas l'une l'autre), vous avez deux options:
1) Rendez les données au client dans un formulaire et laissez les données être republiées lors de la prochaine demande. Cela ne convient bien sûr que pour de petites quantités de données ET si vous êtes sûr que ce n'est ni sensible ni problématique si l'utilisateur falsifie les données.
2) Utilisez des sessions. C'est à cela que servent les sessions, c'est-à-dire le contenu du panier, etc. Vous pouvez choisir de sauvegarder ces données dans une base de données ou de les conserver en mémoire dans un objet de session uniquement.
Je ne recommanderais pas d'utiliser TempData pour cela, l'idée derrière TempData est de contenir des données qui ne sont utiles que pour la demande suivante. Pensez aux messages de validation et à ce type de données.
Vous pouvez utiliser
Session ["EmailAddress"] = ModelA.EmailAddress;@chakeda Je suppose que la session est similaire à TempData. Il semble que ce soit une chose ponctuelle. Existe-t-il un moyen naturel qui convient au travail flor ou MVC?
Comment un contrôleur appelle-t-il l'autre? En utilisant Redirect? Action?
@ D.R. Actuellement, ils sont complètement séparés. Cependant, à l'avenir, la vue B est juste après la vue A (parcourue par des boutons). Je n'ai malheureusement pas trouvé de moyen de le faire non plus, j'allais le faire après avoir terminé cela. Maintenant que vous l'avez mentionné, il semble que ce soit peut-être une meilleure idée de connecter d'abord deux vues pour créer un flux de travail.
@aDev Avoir des données persistantes entre les demandes de A à B est à quoi servent les sessions - je dirais que publier des données entre différents contrôleurs n'est pas le flux prévu de MVC. Vous pouvez avoir des fonctions de partage A et B (
dosomething ()), ou appelerdosomething ()dansLogin ().En voyant votre commentaire le plus récent, un ViewModel + Controller + View qui interface à la fois le modèle A et le modèle B serait également élégant!
Vous pouvez utiliser TempData jusqu'à ce que vous l'attribuiez, puis vos données temporaires auront disparu.