mantener viewdata en RedirectToAction


[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateUser([Bind(Exclude = "Id")] User user)
{
        ...
        db.SubmitChanges();
        ViewData["info"] = "The account has been created.";
        return RedirectToAction("Index", "Admin");
}

Esto no mantiene el texto "info" en viewdata después de RedirectToAction. ¿Cómo podría solucionar este problema de la manera más elegante?

Mi idea actual es poner las cosas de Index controlleraction en un [NonAction] y llamar a ese método tanto desde la acción Index como desde la acción CreateUser, pero tengo la sensación de que debe haber una mejor manera.

Gracias.

Author: Thomas Stock, 2009-08-04

5 answers

Puede usar TempData.

TempData["info"] = "The account has been created.".

TempData existe exactamente para esta situación. Utiliza la sesión como almacenamiento, pero no estará presente después de la segunda respuesta.

De MSDN:

Un uso típico de un objeto TempDataDictionary es pasar datos de un método de acción cuando se redirige a otro método de acción. Por ejemplo, un método de acción puede almacenar información sobre un error en la propiedad TempData del controlador (que devuelve un TempDataDictionary object) antes de llamar al método RedirectToAction. El método next action puede manejar el error y representar una vista que muestra un mensaje de error.

 60
Author: Mathias F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-18 00:05:11

Use ViewData si sus datos deben ser accesibles en View durante la solicitud "this". Utilice 'TempData' si sus datos son para la solicitud "next" (por ejemplo POST-REDIRECT-GET design pattern).

 11
Author: eu-ge-ne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-04 09:00:17

Si necesita esto más de una vez, una buena solución sería crear ActionFilterAttributes que exporten/importen los tempdata a viewdata y viceversa. Puede pasar su ModelState de esta manera muy bien también (demostrado aquí - #13). Con unos pocos ajustes a esa pieza de código que tendría una solución limpia, creo.

 2
Author: Leon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-26 14:52:48

Puede usar la propiedad controlador TempData, pero tiene la desventaja de que utiliza el almacenamiento de sesiones en segundo plano. Esto significa que tendrá trabajo adicional para que funcione en una granja web y necesitará tener sesiones habilitadas en su aplicación en primer lugar.

Una alternativa es utilizar cookies si solo necesita transportar un mensaje corto. Esto requiere el cifrado adecuado de la cookie. No depender de la propiedad TempData también le permite establecer mensajes en un contexto no MVC, por ejemplo en una página ASHX clásica.

Eche un vistazo a FlashMessage que puede ahorrarle algo de trabajo implementando esto usted mismo.

 2
Author: Christ A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-15 12:05:00

Dado que TempData parece usar almacenamiento, y cualquier forma de ITempDataProvider que no está "en proceso", requiere que el objeto sea Serializable, TempData parece lamentablemente inadecuado en situaciones de granja web... (ViewDataDictionary no es serializable...¿Alguien tiene alguna sugerencia para esto?

 0
Author: Novox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-24 18:30:38