发送到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
行动上得到派生对象吗?
您需要为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"包含类