[英]Routing to controller with a second parameter that's not an id in Web API
1)我有一個 controller 前綴路線即公司。
當我調用以下操作時:
[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
...
}
它返回公司列表,但現在我想聲明第二個操作,我可以在其中返回公司列表及其前 3 個聯系人,所以我想我會使用以下路線定義我的新操作:
[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
...
}
由於RoutePrefix
被定義為
[RoutePrefix("Companies")]
我以為我可以使用以下命令調用我的 uri:
http://localhost/companies/contacts
但這似乎總是打擊 GetCompanies 行動。
我只能假設我的路線沒有被處理,但我不確定如何添加這樣一個特定的操作
config.Routes.MapHttpRoute(....)
2)另外,定義第二條路線 rest 的方法是否符合標准,還是使用查詢字符串參數來指示我想包含用戶更好?
../公司../公司/用戶
謝謝
更新-1:
這就是我在 WebApiConfig.cs 中的 Register function 已經嘗試添加特定路線但沒有運氣:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "OrganizationWithUsers",
routeTemplate: "api/Companies/Contacts"
);
更新2:
如果我刪除:
[HttpGet]
public async Task<IHttpActionResult> GetCompanies(...
{
...
}
它調用
[HttpGet]
[Route("Contacts")
public async Task<IHttpActionResult> GetCompaniesAndContacts(...
{
...
}
但我收到錯誤The value 'contacts' is not valid for Guid.
.
嗯...我可以看到發生了什么,但我不知道如何解決它。 我還有一個 GetCompany,它的定義如下:
[HttpGet]
public async Task<IHttpActionResult> GetCompany(Guid id)
所以看起來這個現在正在被擊中,這是有道理的。
我試圖在這個上添加一個約束並將我的路由添加回 GetCompaniesAndContacts 並刪除 RoutePrefix 但它不起作用。
我認為存在沖突,因為我有 2 個相同的 get 並且無法區分這 2 個。
更新3:
這是所要求的完整定義:
[RoutePrefix("Companies")]
[ValidationModel]
[ApiException]
public class CompaniesController : BaseController
{
...
[HttpGet]
public async Task<IHttpActionResult> GetCompanies(
int pageIndex,
int pageSize,
string orderBy,
OrderByDirection orderByDirection,
string filters)
{
...
}
[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(
int pageIndex,
int pageSize,
string orderBy,
OrderByDirection orderByDirection,
string filters)
{
...
}
}
創建一個新項目,我能夠創建一個新的 controller,編寫 2 個 GET 操作
public class TestController : Controller
{
public string GetCompanies()
{
return "Companies";
}
public string GetCompaniesAndContacts()
{
return "Companies & Contacts";
}
}
以下 2 個 URL 按預期工作
無需更改路線。
現在我看到您正在嘗試設置特定的路由模式,所以我將代碼更改為...
routes.MapRoute(
name: "Company Routes",
url: "api/Companies/{action}/{id}",
defaults: new {controller = "Test", action = "GetCompanies", id = UrlParameter.Optional}
);
我在默認路由之前添加了上述路由,然后以下 URL 按預期工作
我建議您在一個新的臨時項目中使用路由,然后將理解應用到您的用例中。
我發現了我的問題,它歸結為路由前綴!
我把它定義為:
[RoutePrefix("companies")]
public class CompaniesController : BaseController
{
}
當它應該被定義為:
[RoutePrefix("api/companies")]
public class CompaniesController : BaseController
{
}
一旦按上述方式定義,我就可以使用
[HttpGet]
public async Task<IHttpActionResult> GetCompanies(
int pageIndex,
int pageSize,
string orderBy,
OrderByDirection orderByDirection,
string filters)
{
...
}
要求公司只使用
http://localhost/api/companies?PageIndex...
並要求公司和主要聯系人,我只需要用“聯系人”定義新路線。
[HttpGet]
[Route("Contacts")]
public async Task<IHttpActionResult> GetCompaniesAndContacts(
int pageIndex,
int pageSize,
string orderBy,
OrderByDirection orderByDirection,
string filters)
{
...
}
我現在可以這樣稱呼它:
http://localhost/api/companies/contacts?PageIndex...
愚蠢的錯誤,但仍然希望這對其他人有所幫助。 不要忘記在前綴路由中包含您的api
!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.