2008-10-21 64 views
1

我有類似下面的一些方法: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。

+0

您可以標記下面的答案之一作爲答案,所以我不會繼續回答這個問題。 :P – Haacked 2009-02-01 17:53:54

回答

1

我很難說出您期望的事情以及您發佈的信息。您的BoothRepository.Find方法有可能會出現錯誤,因此每次都會返回相同的內容嗎?

ModelBinder不應該影響此方法,因爲action方法的參數是簡單類型int。

這兩個請求都是GET請求嗎?如果您仍然遇到問題,您是否可以嘗試創建最簡單的repro並將其發送給philha - microsoft dot com?

編輯:問題最終成爲開發人員試圖跨請求重新使用valueprovider(通過讓溫莎城堡管理控制器的生命週期)。目前,不支持跨請求重用控制器實例,就像使用具有IsReusable屬性的IHttpHandler一樣。所以一般來說,跨請求重用控制器需要在你的端做更多的工作。 :)

+0

這不是回購中的錯誤。該存儲庫直接來自Rhino.Commons。我將其指向actionInvoker的GetParameterValue(ParameterInfo)。當我獲得時間時,我會給你一個準系統版本。感謝您的迴應。 – Gilligan 2008-10-21 16:08:05

+0

另外,是的,這兩個都是GET請求。這就是爲什麼我很困惑?我認爲ModelState只會填補失敗的POSTS。 – Gilligan 2008-10-21 16:40:44

1

問題是LifeStyle,我完全忽略了它被定義的事實,這意味着默認情況下控制器將使用Singleton生活方式。爲所有控制器設置LifeStyle爲瞬態將排序此問題。

0

如果使用spring.net修改 控制器的單爲「假」

0

這是一個常見的問題,使用了IoC容器如Spring.NET或溫莎辛格爾頓行爲時。控制器不應該有singleton行爲,因爲ControllerContext是每個請求,很像HttpContext。