Search code examples
asp.net-mvctempdata

TempData not persisting


I have a controller that sets TempData before returning a view,

public ActionResult Edit(int id, int? order)
{
    Route route = new Route();
    // Do Work
    TempData["Route"] = route;
    return View(new FormViewModel(route, obj1, obj2));
}

This view contians a partial view with a link which goes to another action method called delete, the code for the delete link is:

<%= Html.ActionLink("Delete", "Delete", new { order = item.Order })%>

The code for the Delete action method is:

public ActionResult Delete(int order)
{
    Route route = (Route)TempData["Route"];
    // Do Work
}

The problem that I'm having is when I try to get TempData["Route"]; from the Delete action method is returning null.

I'm wondering if the issue is that this is a Get and not a Post? If so how can I do a Post to the Delete ActionMethod from within my form?


Solution

  • TempData persist between two requests. What does the ReturnView method in your Edit action returns? As far as I can tell it is not a standard method defined in the Controller class. Are you redirecting in this method (i.e. returning a RedirectToRouteResult)?

    Also are there any other requests that could occur between your Edit and Delete actions? For example ajax requests.

    Generally it is not a good idea to use TempData to persist something for a long time. The pattern usually is the following:

    public ActionResult Update() 
    {
        // When you put something into the TempData dictionary you usually
        // redirect immediately to an action that will use the object stored
        // inside.
        TempData["something"] = "something";
        return RedirectToAction("success");
    }
    
    public ActionResult Success() 
    {
        var something = TempData["something"];
        return View();
    }
    

    If you need to persist something for a longer time you should use Session.