私は WebApi で継承された型のモデル バインディングを処理しようとしていますが、実際にやりたいことは、既定のモデル バインディングを使用してバインディングを処理することです (それができない型を選択する以外に)、しかし私は基本的な何かが欠けています。
だから私はタイプを持っているとしましょう:
public abstract class ModuleVM
{
public abstract ModuleType ModuleType { get; }
}
public class ConcreteVM : ModuleVM
{
}
MVC コントローラーを使用すると、次のようになります。
public class ModuleMvcBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
if (modelType == typeof(ModuleVM))
{
// Just hardcoding the type for simplicity
Type instantiationType = typeof(ConcreteVM);
var obj = Activator.CreateInstance(instantiationType);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, instantiationType);
bindingContext.ModelMetadata.Model = obj;
return obj;
}
return base.CreateModel(controllerContext, bindingContext, modelType);
}
}
[AttributeUsage( AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Parameter | AttributeTargets.Struct | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class ModuleMvcBinderAttribute : CustomModelBinderAttribute
{
public override IModelBinder GetBinder()
{
return new ModuleMvcBinder();
}
}
次に、コントローラーで属性を使用すると、すべてがうまくいきます。実際の作業には DefaultModelBinder を活用しています。基本的には、正しいオブジェクトのインスタンス化を提供しているだけです。
では、WebApi バージョンで同じことを行うにはどうすればよいでしょうか。
カスタム モデル バインダー (たとえば、Asp.Net Web API でのカスタム モデル バインダーの実装エラー) を使用する場合、BindModel メソッドで "標準" httpオブジェクトをインスタンス化したらバインドします。他の投稿で提案されているように、JSON ( Json を Asp.Net Web API の派生型にデシリアライズする) または XML (カスタム モデルを POST コントローラーにバインドする) に対して具体的に行うことができますが、Web api はそれを分離する必要がありますが、タイプを判別する方法がわからないだけです。(もちろん、すべての具体的なタイプは問題なく処理されます。)
オブジェクトをインスタンス化した後に BindModel 呼び出しを送信する必要がある明らかな何かを見落としていますか?