4

メソッドが ASP.NET MVC を介して呼び出された場合、次の状況で viewModel パラメータが null になることはありませんか? たとえば、URL「.../Home/Index」を使用します。

public ViewResult Index(HomeViewModel viewModel)
{
  // .. do stuff...viewModel is never null here when called within ASP.NET?
}

以前に ASP.NET MVC でこの動作に気付いたことはありませんでしたが、ViewModel (提供されていない場合) がインスタンス化されているようです。

誰かがこの動作を明確にすることができますか。

4

3 に答える 3

10

はい、ビューモデルに割り当てることができるリクエストにパラメーターが存在しない場合でも、常にビューモデルのインスタンスを取得します。

なぜこれが起こるのですか?

これが仕組みですDefaultModelBinder

  1. ビュー モデルのインスタンスを作成します。

  2. モデル内のプロパティを反復し、値プロバイダーに値を見つけて、見つかった値をプロパティに設定するように依頼します。

  3. 作成したインスタンスを返します。

手順が表示DefaultModelBinderされた場合、リクエストにモデル インスタンスに設定できる値があるかどうかは問題ではありません。先に開始してインスタンスを作成し、プロパティを入力するだけです。

それはほとんど意味がありませんよね?

モデル バインダーが、モデルのプロパティと一致する値が含まれているかどうかをリクエストにチェックしてからインスタンスを作成するのは、より複雑です。

于 2012-07-24T16:59:19.303 に答える
4

MVC は、POST/GET 経由で送信された値を取得し、「自動的に」モデルのプロパティにバインドしようとします。これは、デフォルトのモデル バインダーによって行われます。ほとんどの場合、デフォルトのモデル バインダーは、必要なすべてのことを行います。

カスタム モデル バインディングを詳しく調べることができます (さらに理解を深めることができます) が、IModelBinder インターフェイスを調べると、BindModel というメソッドが 1 つ含まれています。このメソッドでは、ControllerContext.HttpContext.Request にあるものをほとんど取得し、クラス プロパティを入力します (基本的に、既定のモデル バインダーが行うのと同じことです)。カスタム モデル バインダーを使用する場合は、ジャンプする必要があるフープがさらにいくつかありますが、バインディングのライフサイクルのアイデアが得られます。

簡単な答え: デフォルトのモデル バインダーでは、null にはなりません。

HTH

于 2012-07-24T16:23:26.060 に答える
0

アクションメソッドパラメーターが複合型の場合、DefaultModelBinderクラスはリフレクションを使用してパブリックプロパティのセットを取得し、それぞれにバインドします。複合型の場合、Activator.CreateInstance(typeToCreate);Then ValueProvidersを使用して、これらのプロパティの値を取得します。モデルバインダーは特定のソースにロックされていませんが、ソースの集合からオブジェクトを構築できることに注意してください。

于 2012-07-24T16:41:45.470 に答える