web-dev-qa-db-ja.com

ASP.NETMVC-カスタムモデルバインディングとデフォルトモデルバインディングの混合

私はタイプを持っています:

public class IssueForm
{
    Order Order {get; set;}
    Item Item {get; set;}
    Range Range {get; set;}
}

OrderとItemの要件のためにカスタムモデルバインダーを作成しましたが、Rangeは引き続きデフォルトモデルバインダーを使用できます。

カスタムモデルバインダー内からデフォルトのモデルバインダーを呼び出してRangeオブジェクトを返す方法はありますか? ModelBindingContextを正しく設定するだけでよいと思いますが、方法がわかりません。


編集

最初のコメントと回答を見ると、デフォルトのモデルバインダーから継承すると便利なようです。

これまでのセットアップの詳細を追加するには、次のようにします。

public IssueFormModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        Order = //code to pull the OrderNumber from the context and create an Order
        Item = //code to pull the ItemNumber from the context and create an Item

        IssueForm form = IssueFormFactory.Create(Order, Item);

        form.Range = // ** I'd like to replace my code with a call to the default binder **

        return form
    }
}

これは愚かなやり方かもしれません...これは私の最初のモデルバインダーです。私の現在の実装を指摘するだけです。


編集#2

したがって、BindPropertyをオーバーライドするための答えは、「バインドがすべて完了しました」メソッドのようにフックして、プロパティを使用してFactoryメソッドを呼び出すことができれば機能します。

私は本当にDefaultModelBinderの実装を見て、愚かなことをやめるべきだと思います。

38
anonymous

次のようなものを試してください。

public class CustomModelBinder :  DefaultModelBinder {
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) {
        if(propertyDescriptor.Name == "Order") {
            ...
            return;
        }

        if(propertyDescriptor.Name == "Item") {
            ...
            return;
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }

}
25
eu-ge-ne

defaultModelBinderからBindPropertyをオーバーライドします。

public class CustomModelBinder:DefaultModelBinder
        {
            protected override void BindProperty( ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor )
            {
                if (propertyDescriptor.PropertyType == typeof(Range))
                {
                    base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
                }
                // bind the other properties here
            }
        }
52
user434917

Order用とItem用の2つの異なるカスタムモデルバインダーを登録し、デフォルトのモデルバインダーにRangeとIssueFormを処理させると思います。

6
Konstantin