发布到Web Api Controller时的多态性

时间:2015-08-29 19:19:03

标签: 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 Controller就像:

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

如果我从CarAdModel应用发布了AngularJs这样的派生对象,我只会获得属于AdModel的属性,是否可以在Post动作中获取派生对象?

1 个答案:

答案 0 :(得分:1)

您需要为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;
        }
    } 

在我的示例模型中,字段&#34; ModelType&#34;包含类/

的完整类型名称