Définir Viewbag avant la redirection


122

Est-il possible de régler le ViewBag avant d'appeler une redirection?

Je veux quelque chose comme:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");

Réponses:


242

Lorsque vous utilisez la redirection, vous ne devez pas utiliser ViewBag, maisTempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}

1
Pourquoi avez-vous @ViewBag si vous n'êtes pas dans la vue?
apkisbossin

6
Je voudrais compléter la réponse car je l'utilise et j'ai été confronté à un petit problème qui se produit lorsque TempData est vide pour une raison quelconque (dans mon cas, je n'ai un message que lorsqu'une conversion est effectuée). J'ai donc dû faire le test if (TempData ["Message"]! = Null) pour éviter une erreur.
Patrick

1
Que faire si la redirection est vers un autre contrôleur? Dans l'action de l'autre contrôleur, ViewBag, TempData et Session sont tous vides!
Andrew

1
@Andrew eh bien, TempData n'est pas lié à un contrôleur spécifique. Peut-être que vous effectuez plus d'une redirection et perdez TempData? Vous pouvez créer un lien vers une nouvelle question avec du code ...
Raphaël Althaus

J'essayais de définir ceux-ci dans la métiod OnAuthorize d'un attribut de filtre, mais aucun ne fonctionnait, alors j'ai fini par utiliser la chaîne de requête pour transmettre les données. À l'inverse, définir TempData dans le contrôleur a fonctionné lorsque j'ai eu besoin de le lire plus tard dans l'attribut de filtre. Merci!
Andrew

13

Vous pouvez utiliser TempData dans cette situation. Voici quelques explications pour ViewBag, ViewData et TempData.


8

J'ai fait comme ça ... et cela fonctionne pour moi ... ici, je change de mot de passe et en cas de succès, je veux définir le message de réussite pour viewbag à afficher sur la vue ..

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }

3

Pris d'ici

Résumé

Les objets ViewData et ViewBag vous permettent d'accéder à ces éléments de données supplémentaires qui accompagnent votre modèle, mais pour des données plus complexes, vous pouvez passer au ViewModel. TempData, d'autre part, est spécialement conçu pour travailler avec des données sur les redirections HTTP, alors n'oubliez pas d'être prudent lorsque vous utilisez TempData.


-2

Ou vous pouvez utiliser Session comme alternative:

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

puis appelez-le chaque fois que vous en avez besoin.

METTRE À JOUR

De plus, comme l'a dit @James dans son commentaire, il serait prudent d'annuler ou d'effacer la valeur de cette session spécifique après l'avoir utilisée afin d'éviter des données indésirables ou une valeur obsolète.


4
Je ne suis pas d'accord là-dessus. n'utilisez pas session pour cela.
Mahmoodvcs

2
C'est une alternative. C'est préférable dans certaines situations.
csharpforevermore

Les variables de session sont utiles pour les choses dont vous avez besoin pour garder une trace entre plusieurs publications / obtentions. Pour une utilisation ponctuelle comme celle-ci, vous DEVEZ vous rappeler de l'effacer, sinon ce seront des données indésirables plus tard, apparaissant indésirables sur certains écrans, ou même déclenchant une logique hors contexte.
James

@James Exactement, c'est ce que je fais dans certains cas, j'ai besoin d'utiliser cette approche. L'annulation ou l'effacement de sa valeur après utilisation est un must pour de tels cas.
Jon P
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.