【问题标题】:URL parameters in MVC 4 Web APIMVC 4 Web API 中的 URL 参数
【发布时间】:2012-03-30 13:00:36
【问题描述】:

假设我在 MVC 4 Web API 控制器中有两种方法:

public IQueryable<A> Get() {}

public A Get(int id) {}

还有以下路线:

routes.MapHttpRoute(
    name: "Default", 
    routeTemplate: "{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

这按预期工作。再添加一个参数,例如:

public IQueryable<A> Get(int p) {}

public A Get(int id, int p) {}

导致MVC对以下请求返回404的情况:

GET /controller?p=100

或者

GET /controller/1?p=100

带有消息“在控制器'控制器'上找不到与请求匹配的操作”

我希望 URL 参数应该由 MVC 连接而不会出现问题,但事实并非如此。这是一个错误还是我对 MVC 如何将请求映射到操作的误解?

【问题讨论】:

  • Here 描述了相同的问题,但没有结论是预期的这种行为
  • 附言。由于同样的问题,如果有多个方法映射到 HTTP 动词,则 URL 中的 OData 语法将不起作用。
  • 您能显示您的实际路线以及控制器中的所有方法和签名吗?

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

如果您考虑一下您正在尝试做什么以及您正在尝试的路线,您会意识到在您的情况下,第二个参数“p”也需要标记为可选参数。

那是你的路线应该这样定义:

routes.MapHttpRoute(
name: "Default", 
routeTemplate: "{controller}/{id}/{p}",
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional });

完成此操作后,网址

/控制器?p=100 将映射到您的

public IQueryable<A> Get(int p) {}

方法和 URL 如下:

 /controller/1?p=100

将映射到您的

public A Get(int id, int p) {}

方法,如你所愿。

所以回答你的问题....不,这不是错误,而是设计/预期的。

【讨论】:

  • 这个还行,不过我记得前段时间用MVC 2的时候,常用的方式就是指定方法参数,不碰路由。示例:here - MVC 应该执行将 URL 的查询部分连接到输入参数的工作。
  • @pborovik,正如我之前所说,“如果你考虑一下”,你会意识到你需要指定第二个参数也是可选的。你不能说第一个参数是可选的,但第二个不是。这没有任何意义。
  • @pborovik 如果您为这些方法定义了“重载”,那么在未提供第二个参数的情况下,API 控制器将分派给这些方法。但是在您的情况下,您只有两种方法,因此调度程序无法调度到任何操作方法。
【解决方案2】:

在 WebApiConfig 中为 httproute 添加新的默认值

其他路线的RouteParameter.Optional 对我不起作用

  config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}/{voucher}",
            defaults: new { id = RouteParameter.Optional ,defaultroute1="",defaultroute2=""}
        );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多