我从头开始创建了一个VS 2012 MVC API项目,加载了Nuget“WebApiContrib.Formatting.Jsonp”,添加了一个路由,格式化程序,并尝试将参数作为序列化JSON发送为JSONP请求。如何在控制器中识别或访问这些参数?
WebApiConfig:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{format}",
defaults: new { id = RouteParameter.Optional,
format = RouteParameter.Optional }
);
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());
Api方法:
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
JQuery的:
$.ajax({
type: 'GET',
url: '/api/Values',
data: JSON.stringify({ "message": "\"Hello World\"" }),
contentType: "application/json; charset=utf-8",
dataType: 'jsonp',
success: function (json) {
console.dir(json.sites);
},
error: function (e) {
console.log(e.message);
}
});
我尝试修改Api方法以包含:
Get( [FromUri] string value)
Get( [FromBody] string value)
Get( CustomClass stuff)
Get( [FromUri] CustomClass stuff)
Get( [FromBody] CustomClass stuff)
CustomClass定义为:
public class CustomClass
{
public string message { get; set; }
}
到目前为止,这些参数都没有产生任何效果。我应该如何从查询字符串中发布的对象中连接这些参数?
编辑:
我可以通过将JQuery ajax修改为:
来欺骗它data: {"value":JSON.stringify({ "message": "\"Hello World\"" })}
我可以对[FromUri] string value
进行去串化并获取我的强类型对象。
尽管如此,我期待数据绑定器将参数反序列化为强类型对象。什么技术可以实现这一目标?
答案 0 :(得分:1)
您正在发出GET
请求,如果GET
请求,则正文只有URI。您为$.ajax()
调用提供的所有数据都将被放入URI中,例如您的EDIT版本将生成如下URI:
.../api/Values?value=%7B%22message%22%3A%22%5C%22Hello%20World%5C%22%22%7D
(请注意,JSON也将进行URL编码)。
现在,Web API中的URI参数正在使用ModelBinderParameterBinding
绑定,这意味着Web API不会使用任何MediaTypeFormatter
(输出复杂类型),而是ModelBinder
/ ValueProvider
(在这种情况下将输出一个简单的类型 - 字符串)。
您可以通过实现自定义ModelBinder
来处理您的场景(请记住使用ASP.NET Web API命名空间中的适当类和接口而不是ASP.NET MVC):
public class JsonModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult == null)
return false;
bindingContext.Model = JsonConvert.DeserializeObject(valueProviderResult.AttemptedValue, bindingContext.ModelType);
return true;
}
}
public class JsonModelBinderProvider : ModelBinderProvider
{
public override IModelBinder GetBinder(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
return new JsonModelBinder();
}
}
使用ModelBinderAttribute
将其附加到您的参数:
public IEnumerable<string> Get([ModelBinder(typeof(JsonModelBinderProvider))]CustomClass value)
{
return new string[] { "value1", "value2" };
}
您可以在此处找到有关此主题的更多详细信息: