我在玩基本控制器的想法,即使用通用資源庫爲我的API控制器提供基本的CRUD方法,這樣我就不必重複相同的基本代碼在每個新的控制器。但是我遇到了路由屬性在基本控制器中被識別的問題。爲了確切地顯示我遇到的問題,我創建了一個非常簡單的WebAPI控制器。.NET WebAPI屬性路由和繼承
當我有主控制器中的Get方法,它直接從ApiController繼承我沒有任何問題,並按預期工作。
[RoutePrefix("admin/test")]
public class TestController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
當我將Get方法移動到基本控制器時,它將返回404頁面的內容。
[RoutePrefix("admin/test")]
public class TestController : TestBaseController
{
}
public class TestBaseController : ApiController
{
[Route("{id:int:min(1)}")]
public string Get(int id)
{
return "Success";
}
}
一些更有趣的注意事項:
我可以在GET /測試/ 1訪問的動作。所以它仍然基於默認路由來查找它。
當我嘗試訪問POST /管理/測試返回以下JSON
{ 「消息」: 「沒有HTTP資源發現匹配的請求URI 'http://test.com/admin/test'。」 「MessageDetail 「:」找不到與名爲'admin'的控制器匹配的類型。「 }
有誰知道的一種方式來獲得的路由與從基本控制器屬性工作?
我試圖完成同樣的事情 - 使用基本API控制器來處理CRUD - 我很驚訝,這不是更常見。這是我第一次看到其他人試圖提到這一點,並且我現在堅持路由繼承問題。你能分享你最終做了什麼嗎? – Brett
我有基礎控制器有保護的方法來實現CRUD操作,然後當我創建一個新的控制器時,我必須創建公共方法並讓它調用受保護的方法。通過這種方式,我可以將路由放在控制器中的方法中,而不是放在基本控制器中,也不必在任何地方複製代碼。我不喜歡它,但另一種方法是不使用Route屬性,並且由於各種原因,這種情況不適用於我的情況。 –
感謝您的回覆。我使用了類似的東西 - 只需調用base [Get | Post | Put | Delete]()並傳遞參數。這並不理想,但是我認爲好處在於,對於不熟悉代碼的用戶來說,放置自定義CRUD操作更爲明顯。你有沒有發現其他在線討論使用基本控制器來處理CRUD操作的資源?我的搜索讓我沒有結果。 – Brett