Перенаправление на действие с параметрами всегда null в mvc

Когда я попытался перенаправить на действие, параметр всегда равен нулю, когда я получил? Я не знаю, почему это происходит так.

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

И у меня есть еще одно сомнение. когда я получал доступ к действию с помощью маршрута, я могу получить значения только RouteData.Values["Id"]. перенаправленные значения не отправляются в параметр.

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

Здесь мне не хватает любой конфигурации? или что-то, что я пропустил.

ActionResult tempAction(Id) {
    // Here Id always null or empty..
    // I can get data only by RouteData.Values["Id"]
}

Ответы

Ответ 1

Вы не можете передавать сложные объекты в URL-адресе. Вам придется отправить свои составные части:

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

Также обратите внимание, что я добавил return RedirectToAction вместо вызова RedirectToAction, как показано в вашем коде.

Но гораздо лучший подход - отправить только идентификатор пользователя:

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

и в вашем целевом действии используйте этот идентификатор для извлечения пользователя из любого места, где этот пользователь хранится (может быть база данных или что-то еще):

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

Некоторые альтернативные подходы (но я не рекомендую и не использую) - это сохранить объект в TempData:

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

и в вашем целевом действии:

public ActionResult Action2()
{
    User user = (User)TempData["user"];
    return View(user);
}