我可以创建一个文件-> 新的 aspnetcore API 项目并使用它IUrlHelper
按名称生成路由,而不会出现任何问题。
[Route("api/[controller]")]
public class ValuesController : Controller
{
public const string GetValues = "GetValues";
public const string GetValuesById = "GetValuesById";
public static string[] Values = new[] { "value1", "value2", "value3", };
// GET api/values
[HttpGet(Name = GetValues)]
public IEnumerable<object> Get()
{
var result = new List<object>();
for(int index = 0; index < Values.Length - 1; index++)
{
string routeForElement = this.Url.RouteUrl(GetValuesById, new { Id = index });
result.Add(new { Value = Values[index], Route = routeForElement });
}
return result;
}
// GET api/values/5
[HttpGet("{id}", Name = GetValuesById)]
public string Get(int id)
{
if (id > (Values.Length - 1))
{
return "Invalid Id";
}
return Values[id];
}
}
当响应被发回时,我正确地拥有了我创建的路由:
[
{
"value": "value1",
"route": "/api/v1/Values/0"
},
{
"value": "value2",
"route": "/api/v1/Values/1"
},
{
"value": "value3",
"route": "/api/v1/Values/2"
}
]
然后,我可以使用 Visual Studio Scaffolding 创建 Razor 页面并继续生成相同的路线,而不会在我的 Razor 页面中出现任何问题:
模型
public class IndexModel : PageModel
{
public List<string> Routes { get; set; } = new List<string>();
public void OnGet()
{
for (int index = 0; index < ValuesController.Values.Length; index++)
{
string routeForElement = this.Url.RouteUrl(ValuesController.GetValuesById, new { Id = index });
Routes.Add(routeForElement);
}
}
}
页
@page
@model UrlHelperWithPages.Pages.IndexModel
@foreach(string route in Model.Routes)
{
<h4>@route</h4>
}
这使得路线没有问题。
如果我添加aspnet-api-versioning
nuget 包并配置它的服务:
services.AddApiVersioning();
我的 API 控制器继续使用以下修改。任何发往此控制器的请求都会正确生成路由。
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ValuesController : Controller
但是,当我们尝试从 Razor Pages 请求中生成路由时,Razor Pages 停止工作。该RouteUrl
方法现在返回 null。我已经尝试更新提供给该RouteUrl
方法的路线数据,以便我通过硬编码版本(用于测试)并且它也不起作用。
new { version = 1, Id = index }
是否需要在 api 版本控制包上进行任何配置以支持页面?我们有剃须刀页面,我们想要生成 API 路由以在页面中呈现,但它似乎不起作用。