C# 发布到Web Api控制器时的多态性

C# 发布到Web Api控制器时的多态性,c#,.net,json,asp.net-web-api,C#,.net,Json,Asp.net 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控制器类似于: public class AdController : ApiCon

我有一个广告模型如下:

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

    public string Title { get; set; }
}
我有很多派生类,比如

public class CarAdModel : AdModel
{
    public int? Kilometer { get; set; }
}
我的
Web Api控制器类似于:

public class AdController : ApiController
{
     [HttpPost]
     public async Task<IHttpActionResult> Post([FromBody] AdModel adModel)
     {
         //db insert
         return Ok();
     }
}
公共类AdController:ApiController
{
[HttpPost]
公共异步任务Post([FromBody]AdModel AdModel)
{
//数据库插入
返回Ok();
}
}

如果我从我的
AngularJs
应用程序发布一个派生对象,如
CarAdModel
,我只能获取属于
AdModel
的属性,我可以在
post
操作上获取派生对象吗?

您需要为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”字段包含类的完整类型名/

您能解释一下吗?您覆盖了默认的活页夹。在我的例子中,字段“ModelType”包含类类型的名称,我使用Activator通过类名称字符串重新创建交付的对象。你可以用其他的旗子谢谢,这只对我有帮助。你不需要
[FromBody]
。复杂类型会自动从主体反序列化