在MVC5中调用时如何将参数传递给方法?

时间:2014-12-15 19:34:18

标签: c# asp.net-mvc

我有一个像这样定义的方法:

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方法。任何想法,如何解决问题?

3 个答案:

答案 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 });

操作的所有路由值必须是一个参数,因此它作为对象传递,然后拆分为接收操作的各种参数。即使你只有一个参数,它仍然在寻找要拆分的对象。