我有一个场景,我将一些数据传递给ASP.NET Web API方法,其中一个是共享基本类型的对象列表。因此,该方法接受单个DTO参数中的POST数据,如Web API所期望的那样,如下所示:
public HttpResponseMessage SaveConfig(SaveConfigRequest req) {
// do stuff with req
}
SaveConfigRequest
DTO的数据如下:
public class SaveConfigRequest {
public string Code { get; set; }
public IEnumerable<BaseParameter> Parameters { get; set; }
}
BaseParameter
是一个抽象类,有几个具体的实现:
public abstract class BaseParameter {
protected BaseParameter(ParameterType type) {
this.Type = type;
}
public ParameterType Type { get; private set; }
public string Name { get; set; }
}
// TODO: implement other parameters
public class DateParameter : BaseParameter {
public DateParameter() : base(ParameterType.Date) {}
public string DefaultDateFormula { get; set; }
}
我需要的是Web API能够反序列化包含参数集合的POST请求,以便将它们反序列化为具体类型。我发布了序列化为JSON的数据。
我做过的一次尝试是将TypeNameHandling
of the Json.NET formatter设置为Auto
并在我发送的JSON中添加$type
属性,但仍然导致方法中出现空集合。
第二次尝试是为BaseParameter
类型创建自定义模型绑定器,但我认为它没有被触发,因为BaseParameter
不是模型,只是一个一部分。也许我还没有正确配置它(我在ModelBinder
上尝试了BaseParameter
属性并在configuration.BindParameter(typeof(BaseParameter), new ParameterModelBinder())
中调用了App_Start
。
所以,我的问题是允许部分Web API方法的模型参数接受抽象类型的值集合的最简单方法是什么?