2015-08-29 101 views
0

我有一个广告模式如下图所示:多态性同时发布到网络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(); 
    } 
} 

如果我从我的AngularJs应用程序发布派生类对象像CarAdModel,我只得到那些属于AdModel性质,我可以得到派生类对象上Post行动?

+0

你不需要'[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类的全类型名称/

+0

您可以请稍微解释一下吗? –

+0

您重写默认联编程序。在我的情况下,“ModelType”字段包含类类型的名称,我使用Activator通过类名字符串重新创建了传递的对象。你可以使用someelse标志 – handmade