2012-12-15 41 views
1

我有一個ApiController與多個GET操作。問題在於,我不想在他們名字的開始沒有「獲取」的情況下爲自己的行爲命名。ApiController GET操作命名

例如,我可以有一個名爲「GetImage」的Action,它會工作得很好。 如果我將其命名爲「UpdateImage」,它不會調用Action,因爲它可能需要在操作名稱的開始處顯式的「Get」。

我可以通過爲每個要使用的動作定義不同的路線來解決這個問題,但我確定必須有一種更簡單的方法來實現它。

我也試過[HttpGet]屬性,不幸的是它並沒有做到這一點。

我的路由配置:

routes.MapHttpRoute(
     name: "ImagesApi", 
     routeTemplate: "api/images/{action}/{id}", 
     defaults: new { controller = "ImageStorageManager",id = RouteParameter.Optional } 
    ); 

,我通過api/images/GetImageapi/images/UpdateImage

+0

我假設你實際上並沒有計劃通過'GET'來更新一個'PUT'請求? – nicodemus13

回答

6

訪問它,我已經創建API控制的方式,不只是一個單一的對象可能幫助您。我從John Papa的關於PluralSight的SPA談話中得到了這種方法(我強烈建議學習單頁應用程序)。他還在其中一個模塊中介紹了這一點。

它有2個部分。

1部分,設置路由做2個正常場景,並增加了我想要的第三位:

// ex: api/persons 
routes.MapHttpRoute(
      name: ControllerOnly, 
      routeTemplate: "api/{controller}" 
     );// ex: api/sessionbriefs 

// ex: api/persons/1 
routes.MapHttpRoute(
      name: ControllerAndId, 
      routeTemplate: "api/{controller}/{id}", 
      defaults: null, //defaults: new { id = RouteParameter.Optional } //, 
      constraints: new { id = @"^\d+$" } // id must be all digits 
     ); 

// ex: api/lookups/all 
// ex: api/lookups/rooms 
routes.MapHttpRoute(
      name: ControllerAction, 
      routeTemplate: "api/{controller}/{action}" 
     ); 

第2部分,在查找CONTROLER(約翰爸爸的情況下),添加ActionName屬性爲方法:

// GET: api/lookups/rooms 
    [ActionName("rooms")] 
    public IEnumerable<Room> GetRooms() 
    { 
     return Uow.Rooms.GetAll().OrderBy(r => r.Name); 
    } 

    // GET: api/lookups/timeslots 
    [ActionName("timeslots")] 
    public IEnumerable<TimeSlot> GetTimeSlots() 
    { 
     return Uow.TimeSlots.GetAll().OrderBy(ts => ts.Start); 
    } 
+0

感謝您的回答 - 不幸的是,ID並沒有做到這一點。 我正在用「硬編碼」路由映射來做這件事,因爲我沒有找到任何其他方式來使其工作。 –