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

11

我希望使用redirectToAction()方法传递多个对象。下面是我正在重定向的actionresult。

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

也许这个链接可以帮到你:https://dev59.com/V3M_5IYBdhLWcg3wt1rD - Dejo
2个回答

21

您无法将对象传递给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不是一个好主意? - Zabavsky
我可以使用像是RedirectToAction("GetEmployees", new { department.DepId = depId, category.CatId = catId,etc..); 这样的东西吗?谢谢 - Ren
不可以使用这个。请记住,RedirectToAction 执行的是 GET 请求,这意味着所有的值都需要作为查询字符串参数发送。你不能像那样发送复杂对象。你必须一个一个地传递它们,或者如我在答案中建议的那样,只传递 ID,这将允许你从目标操作中检索相应的实体。 - Darin Dimitrov

6
这不是一个答案,但我经常看到类似的问题,它们归结为对HTTP工作原理的基本误解或缺乏理解。这并不是批评,许多Web开发人员认为他们只需要了解HTML、JavaScript和CSS就可以制作网站,但他们忽视了实际上需要理解代码运行的平台。你可以这样想:如果你不了解目标平台(Windows、Mac、iOS、Android等),你不会坐下来开始编写应用程序。你必须知道每个平台如何处理内存、垃圾收集、存储等,才能编写出有用的东西。
同样适用于Web。它是一个分布式平台,但仍然是一个平台,因此了解底层结构的工作原理非常重要。在这里,我显然不会详细说明。关于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路径和/或查询字符串传递检索它们所需的标识信息(id、slug等)。如果有任何与所表示的资源不直接相关的数据,则必须将该数据放入其他类型的存储系统中,例如会话。

我点赞这个答案是因为它解释了选择正确方法的原因。谢谢。 - Mantra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接