8

モデルバインダーがASP.NetMVCでどのように機能するかについて少し頭を悩ませています。

具体的には、BindModel()メソッドにはモデル名とタイプを保持するModelBindingContextパラメーターがありますが、ModelBindingContextがこれらの値を受け取る方法がわかりません。

MVCモデルは、投稿されたフォーム値、クエリ文字列パラメーター、またはその他のデータソースから入力する必要があります。しかし、ModelBindingContextに渡されるモデルタイプを決定するメカニズムは何ですか?また、投稿された個々の値を含む単純なリストでさえ、あるモデルタイプが別のモデルタイプよりもどのように選択されるのでしょうか?

ModelBindingContextは、渡されているモデルのタイプを「認識」しているように見えますが、それがどこから来ているのか、またはモデルの作成に関連するワークフローがわかりません。

4

3 に答える 3

15

興味深い質問です。これはMVCが行うことの簡単な概要です。それはすべてControllerActionInovkerクラスによって処理されます。これは特定の順序ではありませんが、近いです。

  1. ControllerActionInovkerは、リフレクションを介してパラメータータイプを決定します。
  2. 次のValueProviderは、HttpContext Request Form、Route、QueryStringなどのプロパティから作成されます。独自のバリュープロバイダーを提供することもできます。
  3. これらのValueProviderは、仮想ValueProviderとして機能するコレクションを介してModelBindingContextに提供されます。
  4. 次に、ControllerActionInovkerは特定のタイプのModelBinderを探します。見つからない場合は、デフォルトで組み込みのDefaultModelBinderになります。
  5. ほとんどの場合、DefaultModelBinderが使用されます。モデルを作成し、ValueProvidersを使用して、モデルのプロパティ名をキーとして使用してプロパティを値に接続するのが仕事です。ValueProvidersに値がある場合、型変換を担当するValueProviderResultオブジェクトを返します。

これは、codeplex.comにあるASP.netMVCソースで確認できます。ControllerActionInvokerクラスとGetParameterValueメソッドを探します。

于 2010-08-22T10:50:21.130 に答える
3

ModelBindingContextは、次のいずれかを行う必要があるため、渡されるモデルのタイプを「認識」します。

  • モデルにModelBinder属性を追加します
  • ModelBinders.Binders.Add()メソッドを使用して、ModelBinderをモデルに登録します。

ModelBinder属性の例:

[ModelBinder(typeof(ContactBinder))]
public class Contact { ... }

ModelBinders.Binders.Add()の例:

void Application_Start()
{
  ModelBinders.Binders[typeof(Contact)] = new ContactBinder();
}

ModelBinderを登録し、BindModelメソッドを実装した場合:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... }
  1. ModelBindingContext.ModelTypeがモデルと等しいことをクエリします。例:

    if (bindingContext.ModelType == typeof(Contact)) { ... }
    
  2. ModelBindingContext.ValueProviderプロパティからモデルを再水和して、フォームの投稿、ルートデータ、クエリ文字列からのデータを表すValueProviderResultインスタンスを取得します。

    bindingContext.ValueProvider["Name"].AttemptedValue;
    

次の書籍は 、 ASP.NET MVC 2inActionおよび ASP.NETMVC1.0Quicklyで使用されました。

于 2010-08-19T19:34:28.477 に答える
1

ControllerActionInvokerはリフレクションを使用してパラメータータイプを取得し、そのタイプを処理するためにModelBinderが割り当てられているかどうかを確認します。その場合、このModelBinderをインスタンス化し、(モデルオブジェクト、モデルを含むBindingContextを渡します。そのパラメータータイプオブジェクトの名前、モデルタイプ、プロパティフィルター)、および1つの大きな仮想値プロバイダーとして機能する他のすべての値プロバイダー(フォーム、クエリ文字列など)の値プロバイダーコレクション(ModelBindingContext.ValueProvider)。

次に、ModelBinder自体がリフレクションを使用して、バインドに割り当てられたタイプのすべてのプロパティ名を取得し、(ModelBindingContext.ValueProvider)内のすべての値プロバイダーに対して再帰的に実行し、それらの値プロバイダー内のプロパティ名を探して、名前(クライアントから取得)はタイププロパティ名と一致します。値プロバイダーと一致すると、モデル上のそれぞれのプロパティの名前と値を持つValueProviderResultオブジェクトが返されます。

于 2011-06-14T13:09:11.143 に答える