1

次の方法に似たものがあります。

    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 がメソッド パラメーターに使用されます。

4

4 に答える 4

1

問題はライフスタイルです。私はそれが定義されているという事実を完全に見落としていました。つまり、デフォルトではコントローラーはシングルトンのライフスタイルを使用します。すべてのコントローラーの LifeStyle を Transient に設定すると、この問題が解決されます。

于 2008-10-29T12:29:17.270 に答える
1

あなたが何を期待しているのか、あなたの投稿から何が起こっているのかを伝えるのは難しい. BoothRepository.Find メソッドにエラーがあり、毎回同じものが返される可能性はありますか?

アクション メソッドへのパラメーターは単純な型 int であるため、ModelBinder はこのメソッドに影響を与えるべきではありません。

これらのリクエストは両方とも GET リクエストでしたか? それでも問題が解決しない場合は、可能な限り簡単な再現コードを作成して、philha - microsoft dot com に電子メールで送信できますか?

編集:問題は、開発者が要求全体で valueprovider を再利用しようとしたことでした (キャッスル ウィンザーにコントローラーのライフサイクルを管理させることにより)。現時点では、IsReusable プロパティを持つ IHttpHandler の場合のように、リクエスト間でコントローラー インスタンスを再利用することはサポートされていません。そのため、一般に、複数のリクエストでコントローラーを再利用するには、エンドでさらに多くの作業を行う必要があります。:)

于 2008-10-21T15:51:06.653 に答える
0

spring.net を使用する場合は、コントローラーのシングルトンを「false」に変更します

于 2009-02-01T10:15:28.683 に答える
0

これは、Spring.NET や Windsor などの IoC コンテナーでシングルトンの動作を使用する場合によくある問題です。ControllerContext は HttpContext のようにリクエストごとであるため、コントローラーはシングルトンの動作を持つべきではありません。

于 2009-02-01T17:51:21.963 に答える