4

我想将一个控制器动作中的类对象传递给不同控制器的动作。

发件人操作

public class CourseController : Controller
{
[HttpPost]
public ActionResult CreateNewCourse(CourseViewModelBase courseViewModel)
{
   if (ModelState.IsValid)
   {
       // Do some stuff
       return RedirectToAction("CreateNewProject", "Project",
                          new { courseVM = courseViewModel});
   }
   // Bad happened    
   return View("CreateNewCourse", courseViewModel);
}

接收方操作

public class ProjectController : Controller
{
[HttpGet]
public ActionResult CreateNewProject(CourseViewModelBase courseVM)
{
      // Use CourseVM data and do other stuff
     return View("Create", projectCreateViewModel);
}
}

我在发送方操作中正确获取数据,并且接收方操作从重定向到操作调用中正确调用。但是Receiver Action中的courseVMnull

我知道这是一个非常古老的问题,并且被反复问过。但我发现大多数答案都建议使用TempData并在 2008/2009 年得到回答。我相信会有某种方式使用RedirectToAction without using TempData. 如果没有,那么我只会使用 TempData。

查找 如果我传递了一些简单的数据,例如new {id = courseViewModel.CourseDuration}并将 Receiver 操作中的参数更改为 id,那么 id 会被正确接收。

类似问题 问题 1
问题 2
问题 3
问题 4
问题 5
问题 6,尝试使用这个但没有锻炼
问题 7
问题 8
问题 9
问题 10

上述问题中的大多数答案都可以追溯到 2008/09 年并使用 tempdata

4

2 回答 2

4

这个问题本身现在大约一年了,但我遇到了它,所以我想我会帮助将来遇到它的其他人。接受的答案不起作用 - 复杂对象仍然到达接收操作 null。

我发现这个 2012 年的答案仍然有效。您只是不能在 HttpGet 请求中传递复杂的对象(本质上,这就是 RedirectToAction 的本质——同样,不是您可以更改的东西)。您只能传递标量值:int、string 等。

确保您已排除以下两个选项:

  • 完全避免发送复杂对象,只发送标量值。显然,这有时只是一种选择——但我提到它是为了提醒你考虑它。
  • 完全跳过接收 Get 操作 - 执行其逻辑并直接从您的 Post 操作返回视图。IE; return View("ReceivingViewName", viewmodel)同样,仅适用于某些情况,您很可能需要其他操作,因此需要重定向,但值得记住的是一种可能性。

如果您无法解决问题,并且已经消除了上述两个选项,您的选择是:

  • 将数据持久化到数据库,如果您知道以后不会使用数据,可能会使用临时表。将主键发送到接收操作,然后查询数据库。这是“最干净”的选项。
  • [编辑选项] 将对象存储在 TempData(数据仅持续到使用它的下一个请求- 如果不使用,它将在会话的生命周期内一直存在)或 Session(数据在会话的生命周期内持续)。两者都不是很好的选择。TempData 可能是两者中更好的,因为它的生命周期可能更短......但是您仍然必须考虑当页面重新加载或对该方法发出后续请求时会发生什么(例如,WebGrid 分页 - 其中是我的场景)。对于这些特定场景,我最初建议从 TempData 中取出数据,然后将其放回原处,以便后续对该操作的请求可用。因为 TempData 实际上会一直存在,直到它被使用有一次,这使得这个选项更不受欢迎,因为如果用户导航到其他地方,它不会消失。更多信息请参见此处的答案。底线是不要在 TempData 中放入任何内容,除非您打算立即使用它。如果你不需要分页等特定场景的数据,并且你把它放在 TempData 中并立即在接收方法中使用它,而不把它放回去,这个选项是可以的。第一个选项仍然更好。
于 2014-06-27T14:59:10.300 回答
3

用这个

 return RedirectToAction("ActionName", "ControllerName", modelObj);

在你的情况下

 return RedirectToAction("CreateNewProject", "Course", courseViewModel);

你也可以使用

 TempData
于 2013-07-12T14:23:27.367 回答