您可以使用自定义模型绑定器轻松完成此操作。这对我有用。(使用 Web API 2 和 JSON.Net 6)
public class JsonPolyModelBinder : IModelBinder
{
readonly JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var content = actionContext.Request.Content;
string json = content.ReadAsStringAsync().Result;
var obj = JsonConvert.DeserializeObject(json, bindingContext.ModelType, settings);
bindingContext.Model = obj;
return true;
}
}
Web API 控制器如下所示。(注意:也应该适用于常规的 MVC 操作——我之前也为它们做过类似的事情。)
public class TestController : ApiController
{
// POST api/test
public void Post([ModelBinder(typeof(JsonPolyModelBinder))]ICommand command)
{
...
}
}
我还应该注意,当您序列化 JSON 时,您应该使用相同的设置对其进行序列化,并将其序列化为接口以使 Auto 启动并包含类型提示。像这样的东西。
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };
string json = JsonConvert.SerializeObject(command, typeof(ICommand), settings);