MVC 4 Web API中的URL参数

pav*_*vik 7 c# asp.net-mvc asp.net-web-api

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

public IQueryable<A> Get() {}
Run Code Online (Sandbox Code Playgroud)

public A Get(int id) {}
Run Code Online (Sandbox Code Playgroud)

以下路线:

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

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

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

public A Get(int id, int p) {}
Run Code Online (Sandbox Code Playgroud)

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

GET /controller?p=100
Run Code Online (Sandbox Code Playgroud)

要么

GET /controller/1?p=100
Run Code Online (Sandbox Code Playgroud)

消息"控制器'控制器'上没有找到与请求匹配的操作"

我希望URL参数应该由MVC连接而没有问题,但事实并非如此.这是一个错误还是我对MVC映射请求如何行动的误解?

Shi*_*mar 8

如果你考虑一下你正在尝试做什么以及你正在尝试的路线,你会发现你的情况下第二个参数"p"也需要被标记为可选参数.

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

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

完成此操作后,即URL

/ controller?p = 100将映射到你的

public IQueryable<A> Get(int p) {}
Run Code Online (Sandbox Code Playgroud)

方法和URL如下:

 /controller/1?p=100
Run Code Online (Sandbox Code Playgroud)

将映射到您的

public A Get(int id, int p) {}
Run Code Online (Sandbox Code Playgroud)

方法,如你所料.

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