我正在使用ASP.NET MVC 1.0。我有一个ActionResult,它从下拉列表中接收一个带有值的表单帖子。然后它重定向到ActionResult,将值作为参数传递。这是我的2个ActionResult方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult FindPromo()
{
var promoId = Convert.ToInt32(Request.Form["ddlPromotion"]);
return RedirectToAction("GetPromo", new { id= promoId });
}
public ActionResult GetPromo(int id)
{
if (promoId > 0)
{
var model = GetModel(id);
if (model.Promo != null)
{
return View("Promo", GetModel(id));
}
}
return RedirectToAction("NotFound");
}
当我调试它时,从我的表单中正确地提取下拉列表中的值,但是在重定向上,与先前请求不同的值作为GetPromo方法上的promoId值。即使我完全关闭页面并重新加载它,就好像它被缓存在某个地方一样。我知道这很简单,但我以前从未碰过这个。
编辑:
我将参数名称从promoId更改为id,并且还更新了我的路由表。我已经更新了上面的代码示例,这是我的路线:
routes.MapRoute("GetPromo", "{controller}/GetPromo/{id}",
new { controller = "Promo", action = "GetPromo" });
routes.MapRoute("FindPromo", "{controller}/FindPromo/{id}",
new { controller = "Promo", action = "FindPromo" });
然而,我仍然使用参数获得相同的结果。
答案 0 :(得分:2)
您是否尝试过使用默认路由设置:{controller} / {action} / {id}? 那些是你唯一的路线吗?路由按顺序进行评估,因此如果匹配,则先前路由可以覆盖下面的路径。 Phil Haack在他的博客haacked.com
上发布了一个路由调试器您还可以使用:RouteTable.Routes.GetVirtualPath(),传递ViewContext.RequestContext和RouteValueDictionary,并查看生成的Url。
答案 1 :(得分:1)
我想知道它是否与您的路由设置有关。尝试将promoId
重命名为id
并更新路线值。如果这不起作用,您可以使用您的路线更新您的帖子。
答案 2 :(得分:1)
你试过这个吗?
return RedirectToAction("GetPromo", new { id = promoId.ToString() });
我认为我们遇到了类似的问题并解决了这个问题。
如果没有,你可以这样做:
var dict = new RouteValueDictionary();
dict.Add("id", promoId);
return RedirectToAction("GetPromo", dict);
作为建议,你不应该使用Convert.ToInt32,而是使用int.Parse或int.TryParse。
答案 3 :(得分:0)
检查您的IOC容器是否未将控制器注册为单件。我正在使用Windsor,默认的生活方式类型是单身,这导致了“缓存”行为。请参阅:ASP.NET MVC - Controller parameter not being gathered from form?