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

时间:2013-04-01 13:06:35

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我想使用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 });

2 个答案:

答案 0 :(得分:19)

您无法将对象传递给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);
    ...
}

答案 1 :(得分:4)

这本身并不是一个答案,但我总是看到与此类似的问题归结为对HTTP如何工作的基本误解或缺乏理解。这不是批评,许多网站开发人员认为他们需要知道的只是HTML,JavaScript和CSS来制作一个网站,但是他们忽略了需要真正理解平台他们的代码正在运行上。以这种方式看待它:如果不了解您的目标平台(Windows,Mac,iOS,Android等),您就不会坐下来开始编写应用程序。你 知道每个人如何处理内存,垃圾收集,存储等,以便编写任何可能的内容。

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

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

这有点像切线,但重要的是要理解查询字符串不是传递无关数据的方法。查询字符串是URI的一部分,因此用两个不同的查询字符串加载的确切页面是两个完全不同的资源。

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