razor - 添加 aspnet-api-versioning 可防止 UrlHelper 在 Razor 页面请求中生成控制器 API 路由
问题描述
我可以创建一个文件-> 新的 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 路由以在页面中呈现,但它似乎不起作用。
解决方案
推荐阅读
- node.js - 使用 Heroku 部署 React.js 和 Node.js 应用程序
- python - Python .. 在特定语句中带有冒号的语法是什么?
- azure-devops - 带有日期的 Azure DevOps 查询
- c - 你能声明一个命名结构的匿名实例吗?
- c# - 循环通过复选框列表并根据选择发送电子邮件
- python - 我在使用 pyreadr 读取 RData 时遇到问题
- mysql - 表触发器指示两条记录已合并
- magento - 如何在 Magento 2 中将管理系统配置页面设置为全宽
- html - Bootstrap:当我们点击时导航栏没有关闭,响应问题
- emacs - Emacs yank 行为改变了 - 如何恢复旧行为?