使用参数重定向到操作在mvc中始终为null

时间:2013-10-18 06:57:50

标签: asp.net-mvc-4

当我尝试重定向到操作时,我收到时参数总是为空?我不知道为什么会发生这样的事情。

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 个答案:

答案 0 :(得分:34)

您不能在这样的网址中传递复杂对象。您必须发送其组成部分:

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

但更好的方法是只发送用户的id:

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

并且在您的目标操作中使用此ID从该用户存储的任何位置检索用户(可能是数据库或其他内容):

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