假设我在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连接,没有问题,但这不是真的。这是一个bug还是我对MVC如何将请求映射到操作的误解?
发布于 2012-03-30 14:04:29
如果您考虑您正在尝试执行的操作和正在尝试的路由,您将意识到在您的示例中,第二个参数"p“也需要被标记为可选参数。
也就是说,您的路由应该定义如下:
routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}/{p}",
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional });
执行此操作后,URL
/controller?p=100将映射到您的
public IQueryable<A> Get(int p) {}
方法和URL,如下所示:
/controller/1?p=100
将映射到您的
public A Get(int id, int p) {}
方法,正如您所期望的。
因此,回答你的questions....no,这不是一个错误,而是设计/预期的。
发布于 2015-04-23 05:09:50
在WebApiConfig中,将新的默认值添加到httproute
附加路径的
RouteParameter.Optional对我不起作用
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{voucher}",
defaults: new { id = RouteParameter.Optional ,defaultroute1="",defaultroute2=""}
);
https://stackoverflow.com/questions/9943502
复制