ASP.NET MVC RedirectToAction传递错误的参数值?

时间:2009-04-09 19:34:30

标签: asp.net-mvc

我正在使用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" });

然而,我仍然使用参数获得相同的结果。

4 个答案:

答案 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?