在 ASP.net MVC 4 中将类对象从一个控制器动作传递到不同的控制器动作

Posted

技术标签:

【中文标题】在 ASP.net MVC 4 中将类对象从一个控制器动作传递到不同的控制器动作【英文标题】:Passing a class object from one controller action to different controller action in ASP.net MVC 4 【发布时间】:2013-07-11 02:43:03 【问题描述】:

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

发件人操作

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


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

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

发现 如果我传递一些简单的数据,例如new id = courseViewModel.CourseDuration 并将 Receiver 操作中的参数更改为 id ,然后 id 被正确接收。

类似问题 Question 1Question 2Question 3Question 4Question 5Question 6, tried to use this one but did not workoutQuestion 7Question 8@987654329 @Question 10

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

【问题讨论】:

【参考方案1】:

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

我发现 2012 年的 this answer 仍然有效。您只是不能在 HttpGet 请求中传递复杂的对象(本质上这就是 RedirectToAction 的本质 - 再说一遍,不是您可以更改的东西)。您只能传递标量值:int、string 等。

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

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

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

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

【讨论】:

【参考方案2】:

使用这个

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

在你的情况下

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

你也可以使用

 TempData

【讨论】:

采用这种方法有什么害处吗?即不使用 TempData 或 ViewBag Rohit:我认为“RedirectToAction”是最好的方法。谢谢 Hey Pawanism 我在将课程 VM 从 View (.cshtml) 发送到控制器时遇到问题。它总是以 null 的形式出现 您如何从视图或客户端调用操作。表示它的 ajax 调用或在 View 中使用 BeginForm。检查所有参数是否正确传递。 这仅适用于传递原始数据类型,因为实际数据是通过查询字符串参数传递的。复杂对象在目的地始终为空。

以上是关于在 ASP.net MVC 4 中将类对象从一个控制器动作传递到不同的控制器动作的主要内容,如果未能解决你的问题,请参考以下文章

您可以在asp.net mvc中将复杂对象从表单发布到控制器吗

如何在 ASP.NET MVC 中将 CSS 类应用于 Html.ActionLink?

如何在 ASP.Net MVC 中将列表对象显示到视图中?

在 Asp.net MVC 中将值从视图传递到控制器

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

如何在 MVC .ASP NET 中将变量从字符串转换为 int [重复]