如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?

Posted

技术标签:

【中文标题】如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?【英文标题】:How to pass multiple objects using RedirectToAction() in Asp.NET MVC? 【发布时间】:2013-04-01 13:06:35 【问题描述】:

我想使用 redirectToAction() 方法传递多个对象。以下是我要重定向到的操作结果。

public ActionResult GetEmployees(Models.Department department, Models.Category category, Models.Role role)
          

return View();

我想做类似下面的事情

public ActionResult test()

Models.Department dep = new Models.Department();
Models.Category cat.......etc

return RedirectToAction("GetEmployees", dep, cat, role); 

任何帮助将不胜感激 - 谢谢

更新

我可以使用类似的东西

 Models.Department dep = new Models.Department()  DepId = employee.DepartmentId ;
                    Models.Category cat = new Models.Category()  CatId = employee.JobCategoryId ;
                    Models.Role title = new Models.Role()  RoleId = employee.JobTitleId ;

            return RedirectToAction("GetEmployees", new  department = dep, category = cat, role = title );

【问题讨论】:

也许这会对你有所帮助:***.com/questions/1257482/… 【参考方案1】:

您不能将对象传递给 RedirectToAction 方法。此方法旨在仅传递参数。因此,您需要在相应的 GET 请求中传递您想要发出的所有值:

return RedirectToAction("GetEmployees", new 

    DepId = dep.DepId,
    DepName = dep.DepName,
    CatId = cat.CatId,
    RoleId = role.RoleId,
    ... so on for each property you need
);

但更好的方法是只发送这些对象的 id:

return RedirectToAction("GetEmployees", new 

    DepId = dep.DepId,
    CatId = cat.CatId,
    RoleId = role.RoleId
);

然后在目标控制器操作中使用这些 id 从您的底层数据存储中检索实体:

public ActionResult GetEmployees(int depId, int catId, int roleId)

    var dep = repository.GetDep(depId);
    var cat = repository.GetCat(catId);
    var role = repository.GetRole(roleId);
    ...

【讨论】:

为什么TempData 是个坏主意? 我可以使用类似 RedirectToAction("GetEmployees", new department.DepId = depId, category.CatId = catId,etc..); ?谢谢 不,你不能使用这个。请记住,RedirectToAction 执行 GET 请求,这意味着所有值都需要作为查询字符串参数发送。你不能像那样发送复杂的对象。您必须一个一个地传递它们,或者正如我在回答中建议的那样,只传递允许您从目标操作中的基础数据存储区检索相应实体的 ID。【参考方案2】:

这本身并不是一个答案,但我一直看到类似的问题归结为对 HTTP 工作原理的根本误解或缺乏理解。这不是批评,许多 Web 开发人员认为他们只需要知道 htmljavascript 和 CSS 就可以制作一个网站,但他们忽略了真正了解他们的代码运行的平台的必要性在。这样看:在不了解目标平台(Windows、Mac、iosandroid 等)的情况下,您不会坐下来开始编写应用程序。你必须知道每个人是如何处理内存、垃圾收集、存储等的,以便编写任何有意义的东西。

这同样适用于网络。它是一个分布式平台,但仍然是一个平台,了解底层结构的工作原理很重要。我显然不会在这里详细说明这一点。有关 HTTP 和相关技术的整卷书。欲了解更多信息,我强烈建议您选择O'Reilly's HTTP: The Definitive Guide。

至于您的问题,HTTP 实现了各种“动词”,其中最常见的是 GET 和 POST。简单地说,GET 是对要返回的资源的非易失性请求,而 POST 是易失性的(将进行更改、删除资源等)。使用 GET 没有请求“正文”。一个请求可以由不同的部分组成,一个 URL、标头和正文。在 POST 中,发布的数据将构成请​​求正文,但 GET 没有发布的数据,因此没有请求正文。现在,再次,我们在这里简单地说。您可能想知道查询字符串。那不是“发布的数据”吗?从技术上讲,是的,它可以是,但从技术上讲,URL 中的任何内容(或者如果我们真的想准确地说,是 URI)都是现有资源的一段标识数据。例如,当您在 Google 上进行搜索时,您的搜索查询将附加到搜索结果页面的 URI。这发布的数据(您发布了查询),但它不仅仅是数据,带有查询字符串的 URI 给出了对应于该确切查询的资源的位置。输入相同查询的其他人将被发送到相同的 URL。

这有点切题,但重要的是要了解查询字符串不是传递不相关数据的一种方式。查询字符串是 URI 的一部分,因此使用两个不同查询字符串加载的确切页面是 两个完全不同的资源。

继续,重定向不是某种特殊类型的请求(在由不同的 HTTP 动词表示的意义上);它只是对客户端浏览器的一个指令,它应该向指定的 URL 发出另一个 GET 请求。您无法控制使用的动词:它始终是 GET。所以,你不能为了兜风而传递任何东西。如果您有将由被重定向到的 URI 表示的对象,那么显然您将使用 URI 路径和/或传递检索它们所需的 identifying 信息(id、slug 等)请求参数。如果存在与所表示的资源不直接相关的任何数据,则该数据必须进入某种其他类型的存储系统,例如会话。

【讨论】:

我 +1 这个答案是有原因的,因为它解释了选择正确方法的原因。谢谢

以上是关于如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.Net MVC 6 中编辑和继续

Aspose.word在asp.net mvc中如何使用的个人总结

如何在使用 HttpClient 使用 Asp Net Web Api 的 Asp Net Mvc 中提供实时数据?

如何在 ASP.NET MVC 中使用多个表单元素

如何使用 MVC 的内容协商在 ASP.NET Core MVC 中间件中返回响应?

如何在 ASP.NET MVC 中使用路由修复 404?