我有一个像这样定义的方法:
public ActionResult MatchedBusinesses(List<Business> businesses)
{
if (businesses != null)
{
return View(businesses);
}
return View("NoMatchFound");
}
然后,在我的另一种方法中,我有类似于这个的方法:
var list = results.AsEnumerable().OrderBy(b => Math.Abs(Convert.ToInt32(temp) - Convert.ToInt32(b.Zip))).Take(5).ToList();
return RedirectToAction("MatchedBusinesses", "Home", list);
关键是,对于list
变量,我得到了使用查询选择的5个条目。但是,我希望将该结果传递给我的其他方法,该方法将用于其他方法的视图中。问题是,当我调用另一个方法时,businesses
参数始终为null。我该如何解决这个问题?显然,我没有正确地将参数传递给我的MatchedBusinesses
方法。任何想法,如何解决问题?
答案 0 :(得分:1)
您正在使用RedirectToAction
的重载,其中第3个参数为object routeValues
。在内部,该方法使用反射根据对象属性的名称和ToString()
值构建路径值。
它仅适用于值类型的属性,但对于复杂类型的属性(包括集合),它不会绑定,因为(在您的情况下)值是字符串"List<YourAssembly.Business>"
并且字符串不能绑定收集。
您需要在重定向之前保留集合(例如数据库,会话,TempData),然后在操作结果中检索集合。
例如
var list = results.AsEnumerable()....
TempData["results"] = list;
return RedirectToAction("MatchedBusinesses", "Home");
public ActionResult MatchedBusinesses()
{
List<Business> businesses = (List<Business>)TempData["results"];
}
但请谨慎使用TempData
(如果用户刷新浏览器,则数据将丢失)。最好使用某个键将信息保存到数据库,然后将密钥作为路由参数传递给MatchedBusinesses()
方法,以便您可以从数据库中检索数据。
答案 1 :(得分:0)
修改强>
你正在尝试做的事情没有多大意义。您不能也不应该尝试使用List
发送大型和/或复杂对象,例如Route
。相反,您应该使用POST
,或遵循Stephen Muecke的建议使用TempData
但是,您可以使用RouteValue
使用
传递参数return RedirectToAction("ActionName", "ControllerName",
new { paramName = paramValue });
或者如果目标操作它在同一个控制器中
return RedirectToAction("ActionName", new { paramName = paramValue });
参数名称是可选的。但是使用
return RedirectToAction("ActionName", new { paramName = paramValue });
表示目标操作接受名为paramValue的参数。
以下是RedirectToAction
的所有重载
http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.redirecttoaction%28v=vs.118%29.aspx
答案 2 :(得分:-2)
尝试将参数包装在return语句中的空白对象变量中,如下所示:
return RedirectToAction("MatchedBusinesses", "Home", new { businesses = list });
操作的所有路由值必须是一个参数,因此它作为对象传递,然后拆分为接收操作的各种参数。即使你只有一个参数,它仍然在寻找要拆分的对象。