次の方法に似たものがあります。
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 を正しく入力するようになりました。ただし、2 回目はコントローラModelState
に last-use id 値が含まれています。これにより、値ActionInvoker
の代わりにメソッドのパラメーターでそれが使用されRoute
ます。
したがって、2 つの異なるエンティティに対してアクションを 2 回呼び出すと、結果は次のようになります。
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 の性質と、これが発生する理由についての洞察をいただければ幸いです。
編集: この問題は、実際には、Asp.Net アプリケーションの存続期間中に存在する IoC コンテナーからコントローラーをインスタンス化する場合、DefaultValueProvider のバグと思われるものの症状であることがわかりました。何が起こるかというと、DefaultValueProvider は最初に ControllerContext が Controller に与えられ、Controller が再作成されるまで更新されません。これにより、現在の RouteData ではなく、古い RouteData がメソッド パラメーターに使用されます。