在RedirectToAction中传递对象

时间:2013-04-05 03:37:56

标签: c# asp.net-mvc-4

我有一个接收过POST的控制器,并处理了用户请求的内容。然后我构建一个对象,现在,想要RedirectToAction ..

return RedirectToAction() ("Index", "Location", r);

其中r是我正在使用的具有良好名称的对象。但是在目标动作上,r为空。

public ActionResult Index(LocationByAddressReply location)

现在,我在这里读了几篇关于此事的帖子,但我正在努力去理解。

提出的选项是L

TempData["myObject"] = myObject;

但这似乎......很奇怪。不安全。这是最适合传递对象的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以通过两种方式执行此操作:

第一个选项,如果你有一个简单的模型

return RedirectToAction("Index", "Location", new { Id = 5, LocationName = "some place nice" }); 

需要维护时,请考虑以后是否需要在模型中添加属性。所以你可以喜欢这样做:

第二个选项UrlHelper是您的朋友

return Redirect(Url.Action("Index", "Location", model));

第二种选择确实是正确的做法。 model是您构建并希望传递给LocationController的对象。

答案 1 :(得分:2)

是的,您可以在重定向上使用TempData获取值。 您的方法应如下所示:

public ActionResult YourRedirectMethod()

{
   TempData["myObject"]=r;
   return RedirectToAction() ("Index", "Location");

}

public ActionResult Index()
{
   LocationByAddressReply location=null;
   if(TempData["myObject"]!=null)
    {
          location=(LocationByAddressReply)TempData["myObject"];
    }
}

通过这种方式,您可以获得先前在重定向方法上设置的模型值。

答案 2 :(得分:0)

我认为使用TempData是正确的解决方案,请参阅this answer。您可以改为传递由r对象构成的匿名对象。例如,如果你有这个:

public class UserViewModel 
{
    public int Id { get; set; }
    public string ReturnUrl { get; set; }
}

public ActionResult Index(UserViewModel uvm) 
{ 
    ...
}

你可以像UserViewModel这样传递:

public ActionResult YourOtherAction(...)
{
    ...
    return RedirectToAction("Index", "Location", new 
                                                 { 
                                                     id = /*first field*/,
                                                     returnUrl = /*second field*/ 
                                                 });
}

ASP.NET MVC将此解析为您期望作为Index操作中的参数的对象。如果您尚未使用TempData切换代码,请尝试使用。