Establecer Viewbag antes de Redirigir


122

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

Quiero algo como:

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

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();
}

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.


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);
    }

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.


-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.