在RedirectToAction中传递对象

时间:2011-09-29 13:14:07

标签: c# asp.net asp.net-mvc asp.net-mvc-3

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

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

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

4 个答案:

答案 0 :(得分:35)

您无法将类传递给重定向的操作。重定向通过URL完成。 Url是一个字符串,因此它不能包含类(序列化对象到url这里的逻辑真的不合逻辑

相反,您可以使用TempData

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

并在行动中重定向

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,从Action的角度来看,它将从外部获得所需的所有参数。这对测试,维护等更好。

答案 1 :(得分:19)

您可以尝试:

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

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

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

的操作
public ActionResult SearchJob(SearchJob searchJob)

将获得完全重新补水的SearchJob物品。

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

尝试使用Cross-Page Posting您可以确定上一页类型,并使用它对象。