在RedirectToAction中传递对象

Jag*_*ggu 23 c# asp.net asp.net-mvc asp.net-mvc-3

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

RouteValueDictionary dict = new RouteValueDictionary();
            dict.Add("searchJob", searchJob);
            return RedirectToAction("SearchJob", "SearchJob", dict);
Run Code Online (Sandbox Code Playgroud)

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

arc*_*hil 38

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

相反,你可以使用 TempData

TempData["searchJob"] = searchJob;
return RedirectToAction ...;
Run Code Online (Sandbox Code Playgroud)

并在行动中重定向

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ;
Run Code Online (Sandbox Code Playgroud)

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

但我不喜欢上面的方式.如果我在你的位置,并希望按名称搜索作业,我会添加路由参数,如

RouteValueDictionary dict = new RouteValueDictionary();
dict.Add("searchJobName", searchJob.JobName);
Run Code Online (Sandbox Code Playgroud)

并通过参数接收它

public ActionResult SearchJob(string searchJobName)
{
... do something with the name
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以获得更好的用户和HTTP友好URL,从Action的角度来看,它将从外部获得所需的所有参数.这对测试,维护等更好.


Cha*_*lie 20

你可以试试:

return RedirectToAction("SearchJob", "SearchJob", new RouteValueDictionary(searchJob)
Run Code Online (Sandbox Code Playgroud)

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

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

public ActionResult SearchJob(SearchJob searchJob)
Run Code Online (Sandbox Code Playgroud)

将获得完全补水的SearchJob物体.