簡體   English   中英

在Web API中的id參數之后使用操作進行路由

[英]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
    }
}

這里真的有兩個問題:

  1. 有一個返回事件的LocationsController或者是否應該有一個完全獨立的控制器是否有意義?
  2. 如何設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM