我有类似于以下方法的东西:
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。