MVC4 Web API忽略参数

时间:2012-07-17 13:29:32

标签: 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 
      }
  );

下面是常规的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始终为空。

我做错了什么?

2 个答案:

答案 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中。添加这些后,它对我来说非常适合。