Routing MVC4 Web API忽略参数

Routing MVC4 Web API忽略参数,routing,asp.net-mvc-4,asp.net-web-api,Routing,Asp.net Mvc 4,Asp.net Web Api,试图在VisualStudio2010中使用MVCRC4WebAPI建立一个新站点,但似乎不起作用:参数值从未传递给该方法 据我所知,我所做的一切都与这里描述的一模一样: 路由配置: routes.Clear(); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}

试图在VisualStudio2010中使用MVCRC4WebAPI建立一个新站点,但似乎不起作用:参数值从未传递给该方法

据我所知,我所做的一切都与这里描述的一模一样:

路由配置:

  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;
        }
  }
URL:
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)
它运行,但
始终为空


我做错了什么

在路由中,您有
{id}
,但在操作中,您有
,MVC按名称匹配“事物”(路由值、查询字符串值等)

因此,名称应该对齐:

因此,请将您的路线更改为:

routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{value}",
      defaults: new { 
           value= RouteParameter.Optional 
      }
  );
它将与URL一起工作:
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.
注意:如果保留
路由参数。可选
,则需要将操作签名中的类型更改为
int?

或者,您可以更改操作方法签名:

    [HttpGet]
    public int Double(int id)
    {
        return id * 2;
    }
或者您可以保持原样,只需使用以下URL:


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

在您的路线中,您有
{id}
,但在您的操作中,您有
,MVC按名称匹配“事物”(路线值、查询字符串值等)

因此,名称应该对齐:

因此,请将您的路线更改为:

routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{value}",
      defaults: new { 
           value= RouteParameter.Optional 
      }
  );
它将与URL一起工作:
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.
注意:如果保留
路由参数。可选
,则需要将操作签名中的类型更改为
int?

或者,您可以更改操作方法签名:

    [HttpGet]
    public int Double(int id)
    {
        return id * 2;
    }
或者您可以保持原样,只需使用以下URL:


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

当我没有定义属性[RoutePrefix(“”)[Route(“”)时,这种情况会发生在我身上用于我的控制器和web api中的操作方法。添加这些之后,它对我非常有效。

当我没有定义属性[RoutePrefix(“”)][Route(“”)时,这种情况会发生在我身上用于我在web api中的控制器和操作方法。添加它们后,它对我非常有效。

那么基本上,方法中的参数名称必须与模板中使用的名称匹配?这是否意味着我必须为每一个可能的方法创建一个路由,即使它与现有模式匹配(或者使用ID作为我的参数名,不管是什么)?呃..@jamietre这有点过于简单了,但是是的。在MVC和Web.API中,名为ModelBinder的组件负责将传入数据(路由参数、查询字符串、来自集合)与参数对象进行匹配。它和他们的名字匹配。如果您需要更多信息,可以搜索ModelBinder和ValueProviders。谢谢。行。似乎不寻常的是,它通过实际的参数名匹配,而不仅仅是签名,这有点违背了模板的目的!因此,基本上,方法中的参数名称必须与模板中使用的名称匹配?这是否意味着我必须为每一个可能的方法创建一个路由,即使它与现有模式匹配(或者使用ID作为我的参数名,不管是什么)?呃..@jamietre这有点过于简单了,但是是的。在MVC和Web.API中,名为ModelBinder的组件负责将传入数据(路由参数、查询字符串、来自集合)与参数对象进行匹配。它和他们的名字匹配。如果您需要更多信息,可以搜索ModelBinder和ValueProviders。谢谢。行。似乎不寻常的是,它通过实际的参数名匹配,而不仅仅是签名,这有点违背了模板的目的!