2011-09-29 137 views
16

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

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

其中searchJob是SearchJob的实例。但是我没有获取有关SearchJob操作方法的数据。相反,我得到了searchJob的查询字符串= Entity.SearchJob。请帮帮我。我究竟做错了什么?

+1

你看过'RedirectToAction'的文档吗? – bzlm

+0

什么是具有SearchJob操作的控制器?它是同一个控制器吗? –

+0

没有SearchJob是控制器,它具有名为SearchJob的操作。 – Jaggu

回答

28

您不能将类传递给重定向的动作。重定向是通过url完成的。链接字符串,因此它不能包含类(序列化对象的网址是真的出逻辑这里

相反,你可以使用TempData

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

,并在行动中重定向

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ; 

在执行上面的代码之后,TempData将不再包含searchJob。 TempData通常用于单次读取。

但我不喜欢上面的方式。如果我处在你的位置,并希望通过名称搜索的工作,我想补充routeParameters像

RouteValueDictionary dict = new RouteValueDictionary(); 
dict.Add("searchJobName", searchJob.JobName); 

,并通过参数

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

这样,它接收到的动作,你会得到更好的用户和http友好的url,从Action的角度来看,它会从外部获得它需要的所有参数。这对测试,维护等更好。

0

如果您想通过查询字符串或通过POST传递整个对象,则无法将类传递给RedirectToAction方法,您可以使用XML或JSON序列化对象并反序列化接收器控制器中的对象。 如果使用这种方法要小心序列化对象的大小。

16

您可以试试:

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

薪火searchJob对象为RouteValueDictionary构造函数将分解searchJob对象和SearchJob类的每个属性传递作为顶级路线值。

使用默认的模型粘合剂,一个动作定义为:

public ActionResult SearchJob(SearchJob searchJob) 

会收到一个完全重新水合SearchJob对象。

+0

它真的适用于简单对象。但嵌套对象为空。我将不得不使用TempData来代替复杂的对象。 – Sven

+0

在将对象传递给RouteValueDictionary构造函数之前,@Sven是否填充了您的值? – Charlie

+0

是的,该对象之前填充。 – Sven