在我的 ASP.NET Core 项目中,我正在使用aspnet-api-versioning,如下所示:
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/users")]
[Authorize]
public class UserController : Controller
{
[HttpGet, MapToApiVersion("1.0")]
public async Task<IActionResult> GetUsers([FromQuery] string searchString, [FromQuery] bool allOrganizations = false)
{
...
}
}
所以请求被发送到:GET /api/v1/users
.
添加此操作的另一个版本时,我只需添加属性MapToApiVersion("2.0")
,这样它就是GET /api/v2/users
. 没关系。
然而,在一个视图中,我用 ajax 调用这个动作,如下所示:
$.ajax({
url: '@Url.Action("GetUsers", "User", new{version = 1})' + "?searchString=" + $("#user-search").val() + "&allOrganizations=true",
type: "GET",
success: function(data) {
response($.map(data,
function(obj) {
return {
//some mapping
};
}));
}
});
这将调用端点:/User/GetUsers?version=1?searchString={searchString}&allOrganizations=true
因此它将版本附加为查询参数而不是路由参数。
如果我不添加 new {version = 1}
它只是没有“版本”查询参数是一样的。
我也尝试过使用@Url.RouteUrl("Get_Users", new {version =1})
和命名操作,[HttpGet("Get_Users"), MapToApiVersion("1.0")]
但这只是将查询参数附加到当前 url。
但是,如果我将Controllers路由属性从[Route("api/v{version:apiVersion}/users")]
to更改[Route("api/users")]
并省略 version 参数,则 ajax 调用可以正常工作。
那么IUrlHelper
除了硬编码url字符串之外,还有什么方法可以使用(或其他方式)来获得版本化操作的正确路径?还是我在某种程度上做错了版本控制?
我可能只是在这里复杂化了,但我仍然认为这应该有效,不是吗?