发送到Web Api控制器时的多态性

本文关键字:多态性 控制器 Api Web | 更新日期: 2023-09-27 18:10:18

我有一个像这样的广告模型:

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行动上得到派生对象吗?

发送到Web Api控制器时的多态性

您需要为AddModel或像这样的公共绑定器创建自定义绑定器和一些用于恢复目标类的字段:

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"包含类

的完整类型名。