2012-04-12 14 views
12

Actualmente estoy trabajando en una lista de datos que necesito mostrar en una vista que representa una lista y muestra para cada elemento la acción correspondiente que se puede ejecutar, como editarlos o borra los. Para la edición no hay ningún problema para afirmar que se trata de una vista particular. Mi problema es cuando quiero eliminar un elemento, tengo dos opciones en el método de publicación.MVC3 RedirectToAction en un método de publicación y supresión ViewBag

//Call directly the list 
[HttpPost] 
[Authorize] 
public ActionResult Delete(int itemId) 
{ 
    // logic to delete an item 
    ViewBag.Error = ""; // The result of the execution 
    return List(); 
} 

La cosa con esta solución es que la dirección de Internet ya no es el mismo que el primero de ellos: .../Lista, es .../Borrar ahora, no encuentro esta solución grande, el Otra solución es redirigir a la acción, ahora la URL es buena, pero el mensaje de error en ViewBag ya no está visible. ¿Tienen alguna idea mejor?

Respuesta

35

Puede utilizar TempData a mantener la información a través de una solicitud y fue diseñado para este caso de uso exacto. En lugar de usar el ViewBag, use TempData["Error"] = ""; en su lugar. Luego, en el extremo receptor tendría un fragmento como el siguiente:

[HttpGet] 
public ActionResult List() { 
    ViewBag.Error = TempData["Error"]; 
    // ... 
    return View(); 
} 

Ver ASP.NET TempData persists between requests y When to use ViewBag, ViewData, or TempData in ASP.Net MVC 3.

+1

Buena sugerencia para establecer ViewBag.Error = TempData ["Error"] en el controlador, por lo que la vista no necesita preocuparse por este detalle. –

+0

Sí, solía tenerlo en la vista en sí, pero luego tenía mucha lógica en la vista sobre qué variable mirar. Uso el controlador para tomar toda la información necesaria y pasarla a la vista. – Joshua

+0

Muchas gracias Joshua por la respuesta, funciona bien, y gracias por los recursos de lectura también. – Oflocet

13

Si está haciendo una redirección, intente usar TempData en lugar de ViewBag. TempData es un diccionario que conserva las claves/valores en la sesión del usuario hasta la siguiente solicitud de la página. En su controlador:

TempData["Error"] = "A message goes here"; 

en su vista de lista que vamos a redirigir a:

@TempData["Error"] 

O si no está utilizando la maquinilla de afeitar:

<%= TempData["Error"] %> 
+0

Gracias esker por la respuesta. – Oflocet

1

Usando ViewBag a POST ActionResult:

ActionResult SubmitUser() 
{ 
    ViewBag.Msg =TempData["Msg"]; 

    return view(); 
} 

[HtttpPost] 
ActionResult SubmitUser() 
{ 
    TempData["Msg"] ="Submitted Successfully"]; 

    return view(); 
} 
Cuestiones relacionadas