Я ищу обработать привязку модели к унаследованному типу в 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?
Если я использую привязку пользовательской модели (например, Ошибка при внедрении настраиваемого связующего объекта в веб-API Asp.Net), моя проблема (я считаю), что в Метод BindModel Я не нашел хороший способ использовать стандартную привязку http после создания объекта. Я могу сделать это специально для JSON (Deserialising Json для производных типов в Web-API Asp.Net) или XML (Получение моего пользовательского Модель, привязанная к моему контроллеру POST), как это было предложено в других сообщениях, но мне кажется, что победить точку, поскольку веб-api должен разделять это, и есть - он просто не знает, как определить тип. (Все конкретные типы, естественно, обрабатываются просто отлично.)
Я не замечаю что-то очевидное, я должен направлять вызов BindModel после создания экземпляра объекта?