MVC4 Web API忽略参数

Jam*_*rgy 0 routing asp.net-mvc-4 asp.net-web-api

尝试在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 
      }
  );
Run Code Online (Sandbox Code Playgroud)

下面是常规的MVC路线,我也试过完全删除它以查看是否存在一些冲突,但它没有任何区别.

  routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { 
          controller = "Home", 
          action = "Index", 
          id = UrlParameter.Optional 
      }
  );
Run Code Online (Sandbox Code Playgroud)

测试控制器:

  public class TestController : ApiController
  {
        [HttpGet]
        public int Double(int value)
        {
            return value * 2;
        }
  }
Run Code Online (Sandbox Code Playgroud)

网址: 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.
Run Code Online (Sandbox Code Playgroud)

哎呀.这很简单,不是吗?但似乎没有任何结果导致参数被映射.对于它,我也尝试过

http://localhost:1505/api/test/double?id=4
Run Code Online (Sandbox Code Playgroud)

没有不同.如果我使参数接受空值,例如

public int Double(int? value)
Run Code Online (Sandbox Code Playgroud)

它运行,但value始终为null.

我究竟做错了什么?

nem*_*esv 5

在您的路线中,您可以{id}在行动中使用valueMVC并按名称匹配"事物"(路线值,查询字符串值等).

所以名称应该对齐:

所以将路由更改为:

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

它将与URL一起使用: http://localhost:1505/api/test/double/4

注意:如果您离开,则value RouteParameter.Optional需要更改操作签名中的类型int?.

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

    [HttpGet]
    public int Double(int id)
    {
        return id * 2;
    }
Run Code Online (Sandbox Code Playgroud)

或者您可以保留它,因为它只是使用此URL:

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