在RedirectToAction中传递对象

35

我想在RedirectToAction中传递对象。这是我的代码:

RouteValueDictionary dict = new RouteValueDictionary();
            dict.Add("searchJob", searchJob);
            return RedirectToAction("SearchJob", "SearchJob", dict);

这里的 searchJob 是 SearchJob 的一个实例。但是在 SearchJob 操作方法中,我没有得到关于 SearchJob 数据的信息。相反,我得到了 searchJob 的查询字符串 = Entity.SearchJob。请帮助我,我做错了什么?


1
你看过 RedirectToAction 的文档了吗? - bzlm
搜索工作的控制器是什么?它是同一个控制器吗? - Ufuk Hacıoğulları
No SearchJob 是控制器,它有一个名为 SearchJob 的动作。 - Jaggu
2
@bzlm:我还没有看文档。但是我找到了我的问题的答案。我将其存储在TempData中。我觉得这有点小技巧,但它有效。无论如何,感谢你的负评 :) - Jaggu
3
+1 是因为我讨厌有人对别人进行负面评价却不愿意承认。 - user153923
可能是RedirectToAction(..) with complex deep object fails的重复问题。 - mateuscb
4个回答

50

您不能像那样将类传递给重定向操作。重定向是通过URL完成的。URL是一个字符串,因此不能包含类(在此将对象序列化为URL真的很不合逻辑)。

相反,您可以使用TempData

TempData["searchJob"] = searchJob;
return RedirectToAction ...;

并在Action中进行了重定向

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ;
执行上述代码后,TempData将不再包含searchJob。TempData通常用于单次读取。
但是我不喜欢上面的方式。如果我在您的位置并想按名称搜索工作,我会添加路由参数,例如:
RouteValueDictionary dict = new RouteValueDictionary();
dict.Add("searchJobName", searchJob.JobName);

通过参数接收并执行它

public ActionResult SearchJob(string searchJobName)
{
... do something with the name
}

这样做可以获得更好的用户友好和HTTP友好的URL,并且从操作的角度来看,它将从外部获取所有需要的参数。这对于测试、维护等方面更加优越。


30

你可以尝试以下方式:

return RedirectToAction("SearchJob", "SearchJob", new RouteValueDictionary(searchJob))

searchJob对象传递到RouteValueDictionary构造函数中,会分解searchJob对象,并将SearchJob类的每个属性作为顶层路由值传递。

使用默认的模型绑定器,一个定义为:

public ActionResult SearchJob(SearchJob searchJob)

将收到一个完全重新填充的SearchJob对象。


它对于简单对象确实有效。但是嵌套对象为空。我将不得不对于复杂对象使用TempData。 - Sven
@Sven 在将对象传递给 RouteValueDictionary 构造函数之前,您的值是否已填充? - Charlie
是的,对象在之前已经被填充。 - Sven
有一个示例 pastebin 吗? - Charlie

3

如果您想要在查询字符串或通过POST方式传递整个对象,那么您不能将类传递给RedirectToAction方法。您可以使用XML或JSON序列化对象,并在接收方控制器中反序列化对象。

使用此方法时,请注意序列化对象的大小。


-4
尝试使用跨页提交,您可以确定上一页的类型,并使用它的对象。

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