1

我有类似于以下方法的东西:

    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 不应包含任何内容。

这是测试版中的错误,可能是我的代码中的某个错误,还是有一些我不知道的设计功能?感谢您对 ModelState 的性质以及发生这种情况的原因的任何见解。

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

4

4 回答 4

1

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

ModelBinder 不应影响此方法,因为操作方法的参数是简单类型 int。

这两个请求都是 GET 请求吗?如果您仍然遇到问题,您能否尝试创建最简单的复制品并将其通过电子邮件发送到 philha - microsoft dot com?

编辑:问题最终是开发人员试图跨请求重用 valueprovider(通过让 Castle Windsor 管理控制器的生命周期)。现在,不支持跨请求重用控制器实例,就像使用具有 IsReusable 属性的 IHttpHandler 那样。所以一般来说,跨请求重用控制器需要做更多的工作。:)

于 2008-10-21T15:51:06.653 回答
1

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

于 2008-10-29T12:29:17.270 回答
0

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

于 2009-02-01T10:15:28.683 回答
0

在将 Singleton 行为与 IoC 容器(例如 Spring.NET 或 Windsor)一起使用时,这是一个常见问题。控制器不应该有单例行为,因为 ControllerContext 是每个请求的,很像 HttpContext。

于 2009-02-01T17:51:21.963 回答