我有類似下面的一些方法:Asp.Net MVC測試版:以前的RouteData覆蓋當前的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"]
從我的快速掃描與反射似乎它首先結合參數到ModelState中再到路線。但是,我從未發佈過任何模型。據我所知,ModelState不應該包含任何東西。
這是測試版中的一個錯誤,可能是我的代碼中的某個錯誤,或者是否存在某些我不知道的設計特性?深入瞭解ModelState的性質以及爲什麼會發生這種情況,我們對此表示讚賞。
編輯: 我發現這個問題實際上是一個症狀,看起來像是DefaultValueProvider的一個bug,如果你從一個存在於Asp.Net應用程序的生命週期中的IoC容器中實例化一個Controller。 DefaultValueProvider使用給Controller的第一個ControllerContext,並且在重新創建控制器之前從不更新它。這會導致舊的RouteData用於方法參數而不是當前的RouteData。
您可以標記下面的答案之一作爲答案,所以我不會繼續回答這個問題。 :P – Haacked 2009-02-01 17:53:54