1

私はRazor構文でMVC3を使用しており、Apressの本「ProASP.Net MVC 3Framework」(非常に優れています)の例を検討しています。その中で、作者は_Layout.cshtmlファイルにこのビットを持っています:

<body>
    <div id="header">
        @{Html.RenderAction("Summary", "Cart");}
        <div class="title">SPORTS STORE</div>
     </div>
     <div id="categories">
        @{ Html.RenderAction("Menu", "Nav"); }
     </div>
     <div id="content">
        @RenderBody()
    </div>
</body>

私の質問はCartControllerクラスと関係があります。コンストラクターでCartオブジェクトが渡されたようですが、上記の_Layout.cshtmlスニペットのコードは、が呼び出されたときに1つを渡していないようRenderAction()です。

CartControllerスニペット:

public ViewResult Summary(Cart cart) {
    return View(cart);
}

そのメソッドをデバッグすると、実際にはCartオブジェクトが渡されますが、それがどこから来ているのかわかりません。このサンプルコードは、依存性注入コンテナとしてNinjectを使用していますが、Cartクラスについて何も知っているという証拠を構成に見つけることができません。MVCに「デフォルト値」メカニズムはありますか?

4

2 に答える 2

4

Summaryアクションメソッドです。コンストラクターではありません。したがって、DIはこれとは何の関係もありません。代わりに、デフォルトのモデルバインダーの動作が表示されます。つまり、モデルバインダーは、アクションメソッドに対して宣言したパラメーターを分析し、フォームまたはクエリ文字列パラメーターとルート値から派生したデータをこれらの引数に入力しようとします。

特定のシナリオでは、Html.Action呼び出しにルート値を渡していないため、クラスをインスタンス化するCartだけです。クラスを調べると、おそらく空であることがわかります(プロパティが設定されていません)。

ただし、ルート値をAction呼び出しに渡すと、そのオブジェクトにデータが入力されます。たとえば、Cartint型の「Size」というプロパティが含まれていて、アクション呼び出しが次のようになっている場合:

@Html.Action("Summary", "Cart", new { Size = 5 })

これCartで、クラスのSizeプロパティが5に設定されます。

Action(この場合、メソッドではなくメソッドを使用する方がはるかにクリーンであることに注意してくださいRenderAction。これまで見てきたように、ステートメントレベルの呼び出しを想定していますRenderAction。これには、醜い中括弧が必要です。 Action一方、式であり、実際のHTMLコンテンツはインラインであるため、より簡潔に表現できます。)

于 2011-12-21T21:45:19.013 に答える
1

Summaryは実際にはアクションメソッドであり、コンストラクターではありません。データは、さまざまな場所から取得できます。

  • ルートパラメータ
  • クエリ文字列
  • フォーム変数
  • 等。
于 2011-12-21T21:46:56.803 に答える