我有类似于以下方法:
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。
答案 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。