[英]Routing with action after id parameter in Web API
在web api中,默認路由是: /api/locations/123?days=5
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
但是,如果我希望路徑看起來像這樣/api/locations/123/events?days=5
同時仍然可以使用類似這樣的路徑命中LocationsController
/api/locations/123?state=md
控制器:
public class LocationsController : ApiController {
// GET api/locations/123/events?days=5
public IEnumerable<Event> GetEventsByDays(int idLocation, int days) {
// do stuff
}
// GET api/locations/123?state=md
public IEnumerable<Location> GetLocationsByState(string state) {
// do stuff
}
}
這里真的有兩個問題:
LocationsController
或者是否應該有一個完全獨立的控制器是否有意義? WebApiConfig
的路由以允許這樣的路由? 你在談論兩件不同的事情:
在ASP.NET MVC和Web Api中使用路由將URL直接映射到控制器和/或操作。 這對於可讀性特別有用,因為開發人員可以專注於設計人類可讀的URL(例如,產品支持和搜索引擎索引)。 這里重要的是路線和控制器之間沒有唯一的關系。 如果需要,您可以創建10個路徑來映射相同的控制器/操作。
例如,您的兩條路線可能是這樣的
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{idLocation}/events/{days}",
defaults: new { id = RouteParameter.Optional }
);
另請注意,對於默認路由模板, /api/locations/123?state=md
不正確。 這是/api/locations/123
。 因為url中有一個額外的參數,所以你將執行GetLocationsByState。
建議每個控制器具有一個單一的責任,並使其盡可能小。 您的業務邏輯應該在其他地方。
Jeffrey Palermo(洋蔥建築的創造者)說
如果您無需滾動就無法在屏幕上看到ASP.NET MVC操作方法,則會出現問題
最后,就像你的一切一樣,你可以做你想做的事,而不用關注它是好還是壞。 困難並不總是設置架構,而是維護並遵循自己的規則。
如果您想要獨立於位置操作事件,則可以為事件設置單獨的控制器。 請看看這是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.