Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC3 RedirectToAction in a post method and ViewBag suppression

i'm currently working a list of data that i need to display in a view that represent a list and show for each item the corresponding action that can be executed, like edit them or delete them. For the edition there is no problem concedering that it's a particular view. My problem is when i want to delete an item, i have two choices in the post method.

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

The thing with this solution is that the url is no longer the same as the first one : .../List, it's .../Delete now, i don't find this solution great, the other solution is to redirect to the action, now the url is good, but the error message in the viewBag is no longer visible, Do you guys have some better idea.

like image 228
Oflocet Avatar asked Apr 12 '12 13:04

Oflocet


2 Answers

You can use TempData to persist information across one request and it was meant for this exact use case. Rather than use the ViewBag use TempData["Error"] = ""; instead. Then, on the receiving end you would have a snippet like the following:

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

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

like image 96
Joshua Avatar answered Sep 28 '22 01:09

Joshua


If you are doing a redirect, try using TempData instead of ViewBag. TempData is a dictionary that preserves keys/values in the user's session until the next page request. In your controller:

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

In your List view that you are redirecting to:

@TempData["Error"]

Or if you are not using razor:

<%= TempData["Error"] %>
like image 31
Mike Mertsock Avatar answered Sep 28 '22 03:09

Mike Mertsock