C# 在RedirectToAction中传递对象

C# 在RedirectToAction中传递对象,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,我有一个控制器,它已收到回帖,并已处理用户的请求。然后我构建了一个对象,现在,我想重定向到Action return RedirectToAction() ("Index", "Location", r); 其中r是我正在处理的命名良好的对象。但在目标操作上,r为null public ActionResult Index(LocationByAddressReply location) 现在,我在这里读了一些关于这方面的帖子,但我很难理解 wasL提出了一个选项 TempData["myO

我有一个控制器,它已收到回帖,并已处理用户的请求。然后我构建了一个对象,现在,我想重定向到Action

return RedirectToAction() ("Index", "Location", r);
其中r是我正在处理的命名良好的对象。但在目标操作上,r为null

public ActionResult Index(LocationByAddressReply location)
现在,我在这里读了一些关于这方面的帖子,但我很难理解

wasL提出了一个选项

TempData["myObject"] = myObject;

但这似乎。。。奇怪的不是类型安全的。这是传递对象的最合适方式吗?

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

public ActionResult YourRedirectMethod()

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

}


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

是的,您可以使用TempData on redirect获得值。 您的方法应该如下所示:

public ActionResult YourRedirectMethod()

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

}


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

您可以通过两种方式完成此操作:

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

return RedirectToAction("Index", "Location", new { Id = 5, LocationName = "some place nice" }); 
如果需要维护,请考虑以后是否需要将属性添加到模型中。所以你可以想象这样做:

public ActionResult YourOtherAction(...)
{
    ...
    return RedirectToAction("Index", "Location", new 
                                                 { 
                                                     id = /*first field*/,
                                                     returnUrl = /*second field*/ 
                                                 });
}
第二种选择,UrlHelper是您的朋友

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

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

您可以通过两种方式完成此操作:

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

return RedirectToAction("Index", "Location", new { Id = 5, LocationName = "some place nice" }); 
如果需要维护,请考虑以后是否需要将属性添加到模型中。所以你可以想象这样做:

public ActionResult YourOtherAction(...)
{
    ...
    return RedirectToAction("Index", "Location", new 
                                                 { 
                                                     id = /*first field*/,
                                                     returnUrl = /*second field*/ 
                                                 });
}
第二种选择,UrlHelper是您的朋友

return Redirect(Url.Action("Index", "Location", model));
第二种选择确实是正确的做法。model是您构建并希望传递给LocationController的对象。

我认为使用TempData不是正确的解决方案,请参阅。相反,您可以传递由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将其解析为您期望作为索引操作参数的对象。如果您尚未切换使用TempData的代码,请尝试一下。

我认为使用TempData不是正确的解决方案,请参阅。相反,您可以传递由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将其解析为您期望作为索引操作参数的对象。如果您尚未切换使用TempData的代码,请尝试使用它。

RedirectToAction确实会重定向您。您的替代方案可能是使用会话。您可以在RedirectToActionIndex、Location、new{object myObject}中传递一个对象。关于这一点,已经有几个问题了:Dave a-我试过了,但仍然为空。如何在接收端访问此对象?@DaveA这些是RouteValue,完全不同。克雷格:你唯一的选择就是使用依赖于会话的东西,或者将它持久化到数据库中。。因此,会话或临时数据是您唯一的选择。RedirectToAction的作用就是重定向您。您的替代方案可能是使用会话。您可以在RedirectToActionIndex、Location、new{object myObject}中传递一个对象。关于这一点,已经有几个问题了:Dave a-我试过了,但仍然为空。如何在接收端访问此对象?@DaveA这些是RouteValue,完全不同。克雷格:你唯一的选择就是使用依赖于会话的东西,或者将它持久化到数据库中。。所以会话或临时数据是您唯一的选择。谢谢。我正在实施这一点。如何确保“TempData”存储不会变得太大?抓取项目后将其删除?TempData将自动变为空。指仅在当前和后续请求期间使用的临时数据。这是会话和tempdataCheck之间的区别,了解更多信息。谢谢。我正在实施这一点。如何确保“TempData”存储不会变得太大?抓取项目后将其删除?TempData将自动变为空。指仅在当前和后续请求期间使用的临时数据。这就是session和tempdataCheck之间的区别,以获取更多信息。