Asp.net mvc 4 在ASP.NET Web Api中自定义绑定

Asp.net mvc 4 在ASP.NET Web Api中自定义绑定,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我在ASP.NET Web Api中遇到以下问题。假设我的ApiController中有以下代码: public void Post(Person person) { // Handle the argument } public class EmberJsonMediaTypeFormatter : JsonMediaTypeFormatter { public override System.Threading.Tasks.Task<object> ReadFr

我在ASP.NET Web Api中遇到以下问题。假设我的
ApiController
中有以下代码:

public void Post(Person person)
{
    // Handle the argument
}
public class EmberJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
    public override System.Threading.Tasks.Task<object> ReadFromStreamAsync(
        Type type,
        System.IO.Stream readStream,
        System.Net.Http.HttpContent content,
        IFormatterLogger formatterLogger)
    {
        return base.ReadFromStreamAsync(
            typeof(JObject),
            readStream,
            content,
            formatterLogger).ContinueWith<object>((task) =>
        {
            var data = task.Result as JObject;
            var prefix= type.Name.ToLower();

            if (data[prefix] == null)
            {
                return GetDefaultValueForType(type);
            }

            var serializer = JsonSerializer.Create(SerializerSettings);

            return data[prefix].ToObject(type, serializer);
        });
    }
}
我想做的是接受以下JSON请求:

{
    "person": {
        "name": "John Doe",
        "age": 27
    }
}

我想为每个模型创建一些保持对象,以便正确地绑定传入数据。在以前的MVC版本中,可以定义前缀之类的东西来解决这个问题。

让我报告一下,我已经能够解决这个问题,实现了
CustomJsonMediaTypeFormatter

public void Post(Person person)
{
    // Handle the argument
}
public class EmberJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
    public override System.Threading.Tasks.Task<object> ReadFromStreamAsync(
        Type type,
        System.IO.Stream readStream,
        System.Net.Http.HttpContent content,
        IFormatterLogger formatterLogger)
    {
        return base.ReadFromStreamAsync(
            typeof(JObject),
            readStream,
            content,
            formatterLogger).ContinueWith<object>((task) =>
        {
            var data = task.Result as JObject;
            var prefix= type.Name.ToLower();

            if (data[prefix] == null)
            {
                return GetDefaultValueForType(type);
            }

            var serializer = JsonSerializer.Create(SerializerSettings);

            return data[prefix].ToObject(type, serializer);
        });
    }
}
公共类EmberJsonMediaTypeFormatter:JsonMediaTypeFormatter
{
公共重写System.Threading.Tasks.Task ReadFromStreamAsync(
类型类型,
System.IO.Stream readStream,
System.Net.Http.HttpContent内容,
IFormatterLogger格式化程序记录器)
{
返回base.ReadFromStreamAsync(
类型(作业对象),
读流,
内容,,
formatterLogger).ContinueWith((任务)=>
{
var数据=任务。结果为JObject;
var prefix=type.Name.ToLower();
if(数据[前缀]==null)
{
返回GetDefaultValueForType(类型);
}
var serializer=JsonSerializer.Create(SerializerSettings);
返回数据[前缀].ToObject(类型,序列化程序);
});
}
}

GlobalConfiguration

中替换默认的
JsonMediaTypeFormatter
,我曾经以类似的方式做过一次(),但现在继续使用&。他们需要做一些工作,但要简单得多,因为我不需要以任何方式更改后端API。是的,这取决于您想要(甚至可以)弯曲哪一侧。