Asp.net mvc 4 在ASP.NET Web Api中自定义绑定
我在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
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。是的,这取决于您想要(甚至可以)弯曲哪一侧。