2009-08-04 12 views
30
[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 "información" en los viewdata después del redirectToAction. ¿Cómo puedo solucionar este problema de la manera más elegante?keep viewdata en RedirectToAction

Mi idea actual es colocar el material de la acción de control Índice en [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 forma mejor.

Gracias.

Respuesta

57

Puede utilizar TempData.

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

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

De MSDN:

Un uso típico para un objeto TempDataDictionary es para pasar los datos a partir de un método de acción cuando se redirecciona 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 objeto TempDataDictionary) antes de llamar al método RedirectToAction. El siguiente método de acción puede manejar el error y representar una vista que muestra un mensaje de error.

+0

Interesante, nunca he oído hablar de él. :-) –

+2

es una lástima que también tenga que usar "TempData" en la vista, y no puede seguir usando ViewData allí. Pero funciona muy bien, así que gracias. –

+0

Consulte el método de extensión de copia http: //blog.eworldui.net/post/2008/06/MVC-Post-Redirect-Get-Sample-Updated.aspx –

10

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

+3

+1 para el patrón PRG –

2

Si necesita más de una vez, una buena solución sería la creación de ActionFilterAttributes el que la exportación/importación de la TempData a ViewData y viceversa. También puede pasar su ModelState de esta manera muy bien (demostrado here - # 13). Con algunos ajustes en esa parte del código, tendría una solución limpia, creo.

0

Desde TempData parece utilizar el almacenamiento, y cualquier forma de ITempDataProvider que no está "en proceso", requiere que el objeto a ser Serializable, TempData parece lamentablemente inadecuado en situaciones agrícolas web ... (ViewDataDictionary no es en sí serializable ...) ¿Alguien tiene alguna sugerencia para esto?

2

Usted puede utilizar la propiedad TempData controlador, pero tiene la desventaja de que utiliza el almacenamiento de sesión en el fondo. Esto significa que tendrá trabajo adicional para que funcione en una granja de servidores web y deberá tener sesiones habilitadas en su aplicación en primer lugar.

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

Tome un vistazo a FlashMessage que le puede ahorrar algo de trabajo la aplicación de este mismo.