代码之家  ›  专栏  ›  技术社区  ›  Mark Struzinski

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

  •  4
  • Mark Struzinski  · 技术社区  · 16 年前

    我正在使用ASP.NET MVC 1.0。我有一个actionResult,它接收一个带有下拉列表值的表单文章。然后它重定向到actionResult,将值作为参数传递。以下是我的两个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 回复  |  直到 16 年前
        1
  •  2
  •   Ariel Popovsky    16 年前

    您是否尝试过使用默认路由设置:控制器/操作/ID? 而且,这些是你唯一的路线吗?按顺序对路由进行评估,以便以前的路由匹配时可以覆盖下面的路由。 PhilHaack在他的博客中发布了一个路由调试程序 haacked.com

    您还可以使用:routeTable.routes.getVirtualPath(),传递viewContext.requestContext和routeValueDictionary并查看结果的URL。

        2
  •  1
  •   tvanfosson    16 年前

    我想知道它是否与您的路由设置有关。尝试重命名 promoId id 更新您的路线值。如果这不起作用,你能用你的路线更新你的帖子吗?

        3
  •  1
  •   Marc Climent    16 年前

    你试过这个吗?

    return RedirectToAction("GetPromo", new { id = promoId.ToString() });
    

    我认为我们遇到了一个类似的问题,解决了这个问题。

    如果没有,您可以这样做:

    var dict = new RouteValueDictionary();
    dict.Add("id", promoId);
    
    return RedirectToAction("GetPromo", dict);
    

    作为建议,您不应该使用convert.toint32,而是使用int.parse或int.typarse。

        4
  •  0
  •   Community CDub    8 年前

    检查IOC容器是否未将控制器注册为单例。我使用的是温莎,默认的生活方式类型是单身,这导致了“缓存”行为。见: ASP.NET MVC - Controller parameter not being gathered from form?