1

MVC が Method(Action) を呼び出し、Model Binder を使用して NamedValueCollection をそのメソッドのパラメーターにマップする方法と同様のものを作成する必要があります。基本的に、クラスのメソッドを動的に呼び出す必要があるコントローラーアクションがあります。コントローラーには、フォームまたはクエリ文字列で送信された情報と、呼び出すメソッドの名前が文字列として含まれています。

私に関する限り、それはアクションを呼び出すことと同じです。私は基本的にそれを別のレベルに渡しています(コントローラーでこれらのメソッドを使用できないのには十分な理由があります)。

ASP.Net MVC 1.0 ソースをダウンロードしましたが、たくさんのクラスがあり、これを処理するコードを見つけるのに苦労しています。

名前が文字列に含まれているメソッドを呼び出す方法は知っていますが、MVC が使用するより良い方法があるかもしれません。また、Model Binders を使用して Request.Form + Query Strings をそのメソッドのパラメーターにする方法も知っておく必要があります。

誰かがこれを行う MVC ソースのコードを教えてくれたり、MVC でデフォルトの Model Binder を手動で使用することに関して正しい方向を教えてくれたりしたら、私は感謝します。

これを明確にすることができるかどうか教えてください。

ありがとう

4

1 に答える 1

3

それは複雑です。FindAction は ControllerActionInvoker で呼び出されます。これは、最終的に、ReflectedControllerDescriptor.FindAction を呼び出します。FindAction は、ActionMethodSelector.FindActionMethod を呼び出します。これは、同じ型で RunSelectionFilters を呼び出します。そのメソッドは、首輪から渡されたメソッドのリストを取得し、それらを反復処理して、各メソッドの引数を調べ、要求の値と比較します。これはリクエストが来るとすぐに実行する必要があるため、すべてキャッシュされます。また、拡張できるように設計されているため、説明したレイヤーの間にいくつかの抽象型があります。したがって、最初は従うのが少し難しいかもしれません。また、コントローラー以外のロジックに再利用するのはおそらく難しいでしょう。ただし、独自のシステムを実装するためのモデルとして使用できます。だと思います』ドメイン固有のアプリケーションには少し複雑すぎます。拡張ポイントの数は、MVC フレームワークにはおそらく適切ですが、独自のコード YAGNI.

ただし、これで十分に開始できることを願っています。

Web スタックなしでモデル バインダーを使用する場合: MVC は必要ですが、必ずしも Web サーバーは必要ありません。単体テストでそれを行う方法は次のとおりです。

    internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:BaseTimeRecordPresentationModel
    {
        var mbc = new ModelBindingContext()
        {
            ModelName = prefix,
            ModelState = modelState,
            ModelType = typeof(T),
            ValueProvider = collection.ToValueProvider()
        };
        IModelBinder binder = new TimeRecordModelBinder();
        var cc = new ControllerContext();

        return binder.BindModel(cc, mbc) as T;
    }

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) where T:BaseTimeRecordPresentationModel
    {
        var msd = new ModelStateDictionary();
        var result = Bind<T>(prefix, collection, msd);
        if (!msd.IsValid)
        {
            Assert.Fail(ModelStateValidationSummary(msd));
        }
        return result;
    }
于 2009-10-01T16:41:35.790 に答える