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映射请求如何行动的误解?
如果你考虑一下你正在尝试做什么以及你正在尝试的路线,你会发现你的情况下第二个参数"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)
方法,如你所料.
所以回答你的问题....不,这不是一个错误,而是设计/预期.