MVC4 Web API忽略参数

问题描述:

尝试在Visual Studio 2010中使用MVC RC4 Web API设置新站点,但它似乎不起作用:参数值永远不会传递给方法。MVC4 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始终为空。

我在做什么错?

在您的路线中,您有{id},但在您的行动中,您有value,MVC与名称匹配的是“事物”(路线值,查询字符串值等)。

所以名称应该一致:

因此改变你的路由:

routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{value}", 
     defaults: new { 
      value= RouteParameter.Optional 
     } 
); 

它将与URL工作:http://localhost:1505/api/test/double/4

注意:如果你离开valueRouteParameter.Optional你需要将您的动作签名中的类型更改为int?

或者你可以改变你的操作方法的签名:

[HttpGet] 
    public int Double(int id) 
    { 
     return id * 2; 
    } 

或者你可以离开它,因为它只是使用这个网址:

http://localhost:1505/api/test/double?value=4

+0

所以基本上,方法中的参数名称必须与模板中使用的名称相匹配?这是否意味着我必须为每种可能的方法创建一个路径,即使它匹配现有的模式(或者使用ID作为我的参数名称,无论如何)?呃.. – 2012-07-17 13:40:38

+0

@jamietre这有点过分简化了,但是。在MVC和Web.API中,称为ModelBinder的组件负责将传入数据(来自集合的路由参数,查询字符串)与参数对象进行匹配。它与名字相匹配。如果您需要更多信息,您可以搜索ModelBinder和ValueProviders。 – nemesv 2012-07-17 13:42:50

+0

谢谢。会做。似乎不寻常的是它与实际的参数名称相匹配,而不仅仅是签名,这种类型打败了模板的目的! – 2012-07-17 13:43:39

这种情况发生,我当我有没有定义属性[RoutePrefix(“”)][Route(“”)]为我的控制器和操作方法在web api.Its完美适用于我后添加这些。