私はタイプを持っています:
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の実装を見て、愚かなことをやめるべきだと思います。
次のようなものを試してください。
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);
}
}
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
}
}
Order用とItem用の2つの異なるカスタムモデルバインダーを登録し、デフォルトのモデルバインダーにRangeとIssueFormを処理させると思います。