Asp.net web api 如何在JSONP Get中绑定MVCAPI参数?

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}",

我从头开始创建了一个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" };
}
我已尝试修改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”};
}
您可以在此处找到有关该主题的更多详细信息:


目前,不太确定确切的解决方案,但请尝试将API参数名称更改为Id,即Get([FromUri]string Id)。。看,如果行得通的话。可能听起来不符合上下文,但请尝试一下。目前,不太确定是否有确切的解决方案,但请尝试将API参数名称更改为Id。即Get([FromUri]string Id)。。看,如果行得通的话。听起来可能有点离题,但不妨试一试。