0

尝试在 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始终为空。

我究竟做错了什么?

4

2 回答 2

5

在您的路线中,您拥有{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

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

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

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

或者您可以保留它,只使用以下 URL:

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

于 2012-07-17T13:37:06.157 回答
0

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

于 2016-07-24T14:42:16.707 回答