我可以创建一个文件>新的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脚手架创建一个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路由,但它似乎不起作用。