29

これはコントローラーの正しい使い方ではないかもしれませんが、私はこの問題に気付き、それを修正する方法を見つけていませんでした。

public JsonResult SomeControllerAction() {

    //The current method has the HttpContext just fine
    bool currentIsNotNull = (this.HttpContext == null); //which is false    

    //creating a new instance of another controller
    SomeOtherController controller = new SomeOtherController();
    bool isNull = (controller.HttpContext == null); // which is true

    //The actual HttpContext is fine in both
    bool notNull = (System.Web.HttpContext.Current == null); // which is false        

}

Controller の HttpContext は、System.Web.HttpContext.Current にある「実際の」HttpContext ではないことに気付きました。

コントローラーに HttpContextBase を手動で設定する方法はありますか? または、コントローラーのインスタンスを作成するより良い方法はありますか?

4

5 に答える 5

63

とりあえず以下のようにします。これは許容できる修正のようです...

public new HttpContextBase HttpContext {
    get {
        HttpContextWrapper context = 
            new HttpContextWrapper(System.Web.HttpContext.Current);
        return (HttpContextBase)context;                
    }
}

これが Controller クラスに追加された場合、これらの Controller は継承元になります。

HttpContext が null であることが望ましい動作であるかどうかはわかりませんが、当面はこれで修正されます。

于 2008-10-22T14:13:51.110 に答える
24

コントローラーは、あなたがやっているように手動で作成するようには設計されていません。本当にすべきことは、再利用可能なロジックを代わりにヘルパー クラスに入れることのように思えます。

于 2008-10-22T14:19:29.227 に答える
5

ControllerContext の HttpContext は、コントローラーの作成時に設定されていないため、null です。コントローラーのコンストラクターはこのプロパティを割り当てないため、null になります。通常、HttpContext は ControllerBuilder クラスの HttpContext に設定されます。コントローラーは ControllerBuilder クラスによって作成され、続いて DefaultControllerFactory が作成されます。コントローラーの独自のインスタンスを作成する場合は、コントローラーの ExecuteMethod を独自の ControllerContext と共に使用できます。やりたくないことは本当のアプリケーションです。フレームワークの経験を積むと、必要な適切な方法を見つけることができます。単体テストで ControllerContext が必要な場合は、モッキング フレームワークを使用して ControllerContext をモックするか、クラス フェイクを作成できます。

このブログの asp.net mvc で要求フローのモデルを見つけることができます。

Asp.net mvc を初めて使用する場合は、ソース コードをダウンロードして、要求がどのように処理されるかを追跡する努力をする価値があります。

于 2008-10-21T22:44:28.740 に答える
0

コントローラーファクトリーを使用していますか?もしそうなら、どのようにコンポーネントを登録していますか?

Windsor の Transient ではなく、HttpContext ベースの依存関係を Singleton として誤って追加したというこの問題に遭遇しました。

HttpContext は、最初のリクエストを除くすべてのリクエストで null でした。それを追跡するのにしばらく時間がかかりました。

于 2008-10-22T13:50:14.557 に答える
0

コントローラーからいくつかの機能を使用したいということですか?または、コントローラーにアクションを実行させますか?

前者の場合は、別のクラスに分割する必要があるコードである可能性があります。後者の場合は、これを実行して、そのコントローラーに特定のアクションを実行させることができます。


return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });

于 2008-10-21T20:17:08.567 に答える