尝试在Visual Studio 2010中使用MVC RC4 Web API设置新站点,它似乎不起作用:参数值永远不会传递给方法。
据我所知,我完全按照此处所述做了所有事情:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
路线配置:
routes.Clear();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new {
id = RouteParameter.Optional
}
);
下面是常规的MVC路线,我也试过完全删除它,看看是否存在 是一些冲突,但它没有任何区别。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
测试控制器:
public class TestController : ApiController
{
[HttpGet]
public int Double(int value)
{
return value * 2;
}
}
网址:http://localhost:1505/api/test/double/4
The parameters dictionary contains a null entry for parameter 'value' of
non-nullable type 'System.Int32' for method 'Int32 Double(Int32)' in
'MyAppName.Controllers.TestController'. An optional parameter must be a
reference type, a nullable type, or be declared as an optional parameter.
哎呀。这很简单,不是吗?但似乎没有任何结果导致参数被映射。对于它,我也试过
http://localhost:1505/api/test/double?id=4
没有区别。如果我使参数接受空值,例如
public int Double(int? value)
它会运行,但value
始终为空。
我做错了什么?
答案 0 :(得分:5)
在您的路线中,您有{id}
,但在您的操作中,您有value
,MVC会按名称匹配“事物”(路线值,查询字符串值等)。
因此名称应该对齐:
因此,请将路由更改为:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{value}",
defaults: new {
value= RouteParameter.Optional
}
);
它可以使用网址:http://localhost:1505/api/test/double/4
注意:如果您离开value
RouteParameter.Optional
,则需要将操作签名中的类型更改为int?
。
或者您可以更改操作方法签名:
[HttpGet]
public int Double(int id)
{
return id * 2;
}
或者您可以保留它,因为它只是使用此URL:
http://localhost:1505/api/test/double?value=4
答案 1 :(得分:0)
当我没有为我的控制器和操作方法定义 [RoutePrefix(“”)] 和 [Route(“”)] 属性时,会发生这种情况在web api中。添加这些后,它对我来说非常适合。