Establecer Viewbag antes de Redirigir

122

¿Es posible configurar ViewBagantes de llamar a una redirección?

Quiero algo como:

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

Respuestas:

242

Cuando use la redirección, no deberá usar ViewBag, peroTempData

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();
}
Raphaël Althaus
fuente
1
¿Por qué tienes @ViewBag si no estás en la vista?
apkisbossin
66
Me gustaría completar la respuesta porque la estoy usando y me enfrenté a un pequeño problema que es cuando TempData está vacío por alguna razón (en mi caso solo tengo un mensaje cuando se realiza una conversión). Así que tuve que hacer la prueba if (TempData ["Message"]! = Null) para evitar un error.
Patrick
1
¿Qué pasa si la redirección es a otro controlador? En la acción del otro controlador, ViewBag, TempData y Session están todos vacíos.
Andrew
1
@ Andrew bien, TempData no está relacionado con un controlador específico. ¿Tal vez haces más de una redirección y pierdes TempData? Puede vincular a una nueva pregunta con algún código ...
Raphaël Althaus
Intenté establecerlos en el método OnAuthorize de un atributo de filtro, pero ninguno funcionó, así que terminé usando la cadena de consulta para pasar los datos. Al revés, configurar TempData en el controlador funcionó cuando más tarde necesité leer eso en el atributo de filtro. ¡Gracias!
Andrew
13

Puede usar TempData en esta situación. Aquí hay alguna explicación para ViewBag, ViewData y TempData.

laszlokiss88
fuente
8

Me gustó esto ... y está funcionando para mí ... aquí estoy cambiando la contraseña y en caso de éxito Quiero configurar el mensaje de éxito en viewbag para que se muestre a la vista ...

    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);
    }
RAVI VAGHELA
fuente
3

Tomado de aquí

Resumen

Los objetos ViewData y ViewBag le brindan formas de acceder a esos datos adicionales que van junto con su modelo, sin embargo, para obtener datos más complejos, puede subir al ViewModel. TempData, por otro lado, está diseñado específicamente para trabajar con datos en redirecciones HTTP, así que recuerde tener cuidado al usar TempData.

Paul Zahra
fuente
-2

O puede usar Session como alternativa:

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

y luego llámalo cuando lo necesites.

ACTUALIZAR

Además, como dijo @James en su comentario, sería seguro anular o borrar el valor de esa sesión específica después de usarla para evitar datos basura no deseados o valores obsoletos.

Jon P
fuente
44
No estoy de acuerdo con eso. no use sesión para esto.
Mahmoodvcs
2
Es una alternativa. Es preferible en ciertas situaciones.
csharpforevermore
Las variables de sesión son útiles para cosas que necesita realizar un seguimiento entre varias publicaciones / get. Para un uso único como este, DEBE recordar borrarlo, o serán datos basura más tarde, aparecerán como no deseados en alguna pantalla o incluso desencadenarán la lógica fuera de contexto.
James
@James Exactamente, eso es lo que hago para algunos casos, necesito usar este enfoque. Anular o borrar su valor después del uso es imprescindible para casos como estos.
Jon P