2015-08-29 3 views
0

У меня есть модель объявления, как показано ниже:полиморфизм при размещении на Web Api контроллер

public class AdModel 
{ 
    public int Id { get; set; } 

    public string Title { get; set; } 
} 

И у меня есть много производных классов, а как.

public class CarAdModel : AdModel 
{ 
    public int? Kilometer { get; set; } 
} 

Мои Web Api Controller, как:

public class AdController : ApiController 
{ 
    [HttpPost] 
    public async Task<IHttpActionResult> Post([FromBody] AdModel adModel) 
    { 
     //db insert 
     return Ok(); 
    } 
} 

Если я отправляю производный объект как CarAdModel из моего AngularJs приложения, я получаю только те свойства, которые принадлежат к AdModel, могу ли я получить полученный объект на Post действия ?

+0

You не нужно '[FromBody]'. Сложные типы десериализуются из тела автоматически –

ответ

0

вам необходимо создать пользовательское связующее для AdModel или общих связующего, как это и некоторое поле для восстановления целевого класса:

public class TypeModelBinder : DefaultModelBinder 
    { 
     protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
     { 
      var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".ModelType"); 
      var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true); 
      var model = Activator.CreateInstance(type); 
      bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type); 
      return model; 
     } 
    } 

В моем примере модели, поле «ModelType» contais полного TypeName класса/

+0

Не могли бы вы немного объяснить? –

+0

Вы переопределяете связующее по умолчанию. В моем случае поле «ModelType» содержит имя типа класса, я воссоздаю поставленный объект по строкам класса с помощью Activator. вы можете использовать флаг someelse – handmade

Смежные вопросы