J'essaie de me familiariser avec le cadre MVC, alors soyez indulgent avec moi.
Pour l'instant, la seule chose que j'utilise dans le magasin de session est le stockage de l'utilisateur actuellement connecté. Mon site web est simple. Pour cet exemple, considérons trois objets de domaine : Personne, Réunion et Fichier. Les utilisateurs peuvent se connecter et afficher le profil "réservé aux membres" d'une réunion et y ajouter des fichiers, ou afficher le "profil" public d'une réunion s'ils ne sont pas connectés.
Ainsi, à partir du profil privé de la réunion, avec un utilisateur connecté, j'ai un lien "ajouter des fichiers". Ce lien mène à FileContoller.Add(int meetingId). À partir de cette action, j'obtiens la réunion à laquelle l'utilisateur veut ajouter des fichiers en utilisant l'identifiant de la réunion, mais une fois le formulaire affiché, j'ai toujours besoin de savoir à quelle réunion l'utilisateur ajoute des fichiers. C'est là que se situe ma question : dois-je transmettre la réunion "en cours d'interaction avec" par le biais de TempData, ou l'ajouter au magasin de session ?
C'est ainsi que j'ai actuellement configuré l'action Ajouter, mais cela ne fonctionne pas :
public ActionResult Add(int meetingId)
{
try
{
var meeting = _meetingsRepository.GetById(meetingId);
ViewData.Model = meeting;
TempData[TempDataKeys.CurrentMeeting] = meeting; /* add to tempdata here */
}
catch (Exception)
{
TempData[TempDataKeys.ErrorMessage] = "Unable to add files to this meeting.";
return RedirectToRoute("MeetingsIndex");
}
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var member = Session[SessionStateKeys.Member] as Member;
var meeting = TempData[TempDataKeys.CurrentMeeting] as Meeting; /* meeting ends up null here */
if (member == null)
{
TempData[TempDataKeys.ErrorMessage] = "You must be logged in to add files to an meeting.";
return RedirectToRoute("LoginPage");
}
if (meeting == null)
{
TempData[TempDataKeys.ErrorMessage] = "An error occurred. No meeting selected.";
return RedirectToRoute("MeetingsIndex");
}
// add files to meeting
TempData[TempDataKeys.Notification] = "Successfully added.";
return RedirectToRoute("AddFiles", new {meetingId = meeting.MeetingId});
}
Edita:
En se basant sur la plupart des réponses, quelqu'un peut-il fournir des exemples sur le type de données (autres que les messages) qui devraient être stockées dans TempData ou dans Session ?
0 votes
De quel type est TempDataKeys, juste une classe ? Ou un enum ?
0 votes
@Anon343224user il est trop tard mais j'écris pour ceux qui se posent des questions comme vous et moi. Je me suis aussi posé la question et j'ai trouvé un usage similaire chez github.com/Macht59/StenoCryptor/blob/master/ il s'agit d'une classe statique qui contient des champs de type consts string.
0 votes
Note aux lecteurs modernes : TempData fonctionne différemment à partir de .NET Core par rapport à la façon dont il est décrit dans de nombreuses réponses ici. Voir ma réponse ici pour les détails.