Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redirect to action with parameters always null in mvc

When I tried redirect to action, the parameter is always null when I received ? I don't know why this happening like these.

ActionResult action1() {
    if(ModelState.IsValid) {
        // Here user object with updated data
        redirectToAction("action2", new{ user = user });
    }
    return view(Model);
}

ActionResult action2(User user) {
    // user object here always null when control comes to action 2
    return view(user);
}

And with this I've another doubt. when I accessed action with route, i can get values only by RouteData.Values["Id"]. the values routed doesn't send to parameter.

<a href="@Url.RouteUrl("RouteToAction", new { Id = "454" }> </a>

Here Am I miss any configure ? or anything I miss.

ActionResult tempAction(Id) {
    // Here Id always null or empty..
    // I can get data only by RouteData.Values["Id"]
}
like image 587
Jeeva J Avatar asked Oct 18 '13 06:10

Jeeva J


1 Answers

You cannot pass complex objects in an url like that. You will have to send its constituent parts:

public ActionResult Action1()
{
     if (ModelState.IsValid)
     {
           // Here user object with updated data
           return RedirectToAction("action2", new { 
               id = user.Id, 
               firstName = user.FirstName, 
               lastName = user.LastName, 
               ...
           });
     }
     return view(Model);
}

Also notice that I have added the return RedirectToAction instead of only calling RedirectToAction as shown in your code.

But a much better approach is to send only the id of the user:

public ActionResult Action1()
{
     if (ModelState.IsValid)
     {
           // Here user object with updated data
           return RedirectToAction("action2", new { 
               id = user.Id, 
           });
     }
     return view(Model);
}

and in your target action use this id to retrieve the user from wherever this user is stored (could be database or something):

public ActionResult Action2(int id)
{
    User user = GetUserFromSomeWhere(id);
    return view(user);
}

Some alternative approaches (but one I don't recommend or use) is to persist the object in TempData:

public ActionResult Action1()
{
     if(ModelState.IsValid)
     {
           TempData["user"] = user;
           // Here user object with updated data
           return RedirectToAction("action2");
     }
     return view(Model);
}

and in your target action:

public ActionResult Action2()
{
    User user = (User)TempData["user"];
    return View(user);
}
like image 69
Darin Dimitrov Avatar answered Nov 02 '22 05:11

Darin Dimitrov