Asp.Net MVC Beta:以前的RouteData会覆盖当前的RouteData吗?

时间:2008-10-21 15:29:28

标签: asp.net-mvc routedata

我有类似于以下方法:

    public ActionResult Details(int id)
    {
        var viewData = new DetailsViewData
        {
            Booth = BoothRepository.Find(id),
            Category = ItemType.HotBuy
        };
        return View(viewData);
    }

以及以下路线:

routes.MapRoute("shows","shows/{controller}/{action}/{id}", new {id = 0});

在测试版之前,当我有预览版3时,一切正常。现在,该方法将在我第一次执行动作时正确填充id。但是第二次控制器的ModelState包含最后使用的id值。这会导致ActionInvoker在方法的参数中使用它而不是Route值。

因此,如果我在两个不同的实体上调用该动作两次,结果是这样的:

www.mysite.com/shows/Booth/Details/1  => Details(1)
www.mysite.com/shows/Booth/Details/2  => Details(1)  //from ModelState["id"]

从我使用Reflector的快速扫描看来,它首先将参数绑定到ModelState然后绑定到Routes。但是,我从未在模型中发布任何内容。据我所知,ModelState不应包含任何内容。

这是Beta中的错误,可能是我代码中某处的错误,还是有一些我不知道的设计功能?任何洞察ModelState的性质以及为什么会发生这种情况都值得赞赏。

编辑:  我发现如果从Asp.Net应用程序的生命周期中存在的IoC容器中实例化Controller,这个问题实际上是DefaultValueProvider的一个错误的症状。发生的事情是DefaultValueProvider使用第一个ControllerContext给控制器并且在重新创建控制器之前永远不会更新它。这会导致旧的RouteData用于方法参数,而不是当前的RouteData。

4 个答案:

答案 0 :(得分:1)

我很难说出你期望发生的事情以及你的帖子发生了什么。您的BoothRepository.Find方法是否可能出现错误,以至于每次都返回相同的内容?

ModelBinder不应该影响此方法,因为action方法的参数是一个简单类型int。

这两个请求都是GET请求吗?如果您仍有问题,可以尝试创建最简单的repro并通过电子邮件发送给philha - microsoft dot com吗?

编辑:问题最终是开发人员试图跨请求重复使用valueprovider(让Castle Windsor管理控制器的生命周期)。现在,不支持像IHttpHandler那样重复使用控制器实例,因为IHttpHandler具有IsReusable属性。因此,通常,在请求之间重用控制器需要在您的最终完成更多工作。 :)

答案 1 :(得分:1)

问题是LifeStyle,我完全忽略了它被定义的事实,这意味着默认情况下控制器将使用Singleton生活方式。将所有控制器的LifeStyle设置为Transient将对此问题进行排序。

答案 2 :(得分:0)

如果你使用spring.net修改 控制器的单例为“假”

答案 3 :(得分:0)

将Monton行为与Spring.NET或Windsor等IoC容器一起使用时,这是一个常见问题。控制器不应该具有单例行为,因为ControllerContext是每个请求,就像HttpContext。