Asp.net web api 如何在JSONP Get中绑定MVCAPI参数?
我从头开始创建了一个VS 2012 MVC API项目,加载了Nuget“WebApiContrib.Formatting.Jsonp”,添加了一个路由和格式化程序,并尝试将参数作为序列化JSON作为Jsonp请求发送。如何在控制器中识别或访问这些参数 WebApiConfig:Asp.net web api 如何在JSONP Get中绑定MVCAPI参数?,asp.net-web-api,web-api-contrib,Asp.net Web Api,Web Api Contrib,我从头开始创建了一个VS 2012 MVC API项目,加载了Nuget“WebApiContrib.Formatting.Jsonp”,添加了一个路由和格式化程序,并尝试将参数作为序列化JSON作为Jsonp请求发送。如何在控制器中识别或访问这些参数 WebApiConfig: config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}/{format}",
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" };
}
我已尝试修改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; }
}
到目前为止,所有这些都只为参数生成null。我应该如何从querystring中发布的对象连接这些参数
编辑:
我可以通过将JQuery ajax修改为:
data: {"value":JSON.stringify({ "message": "\"Hello World\"" })}
为此,我可以对[FromUri]字符串值进行反序列化
,并获取我的强类型对象
不过,我还是希望数据绑定器将参数反序列化到强类型对象中。是什么技术导致了这种情况?您正在发出一个
GET
请求,在GET
请求的情况下,没有主体,只有URI。为$.ajax()
调用提供的所有数据都将放入URI中,例如,您的编辑版本将生成如下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命名空间中的适当类和接口)来实现您的场景:
并使用modelbinderatAttribute
将其附加到参数:
public IEnumerable<string> Get([ModelBinder(typeof(JsonModelBinderProvider))]CustomClass value)
{
return new string[] { "value1", "value2" };
}
public IEnumerable Get([ModelBinder(typeof(JsonModelBinderProvider))]CustomClass值)
{
返回新字符串[]{“value1”,“value2”};
}
您可以在此处找到有关该主题的更多详细信息:
GET
请求,如果是GET
请求,则没有正文,只有URI。为$.ajax()
调用提供的所有数据都将放入URI中,例如,您的编辑版本将生成如下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命名空间中的适当类和接口)来实现您的场景:
并使用modelbinderatAttribute
将其附加到参数:
public IEnumerable<string> Get([ModelBinder(typeof(JsonModelBinderProvider))]CustomClass value)
{
return new string[] { "value1", "value2" };
}
public IEnumerable Get([ModelBinder(typeof(JsonModelBinderProvider))]CustomClass值)
{
返回新字符串[]{“value1”,“value2”};
}
您可以在此处找到有关该主题的更多详细信息: