Мы находимся в процессе обновления проекта ASP.NET Core 2.2 до ASP.NET 3.0, который использует маршрутизацию EndPoint.
У нас есть большой список URL-адресов, составленный из Url.RouteUrl
с использованием именованных маршрутов, например:
string url = Url.RouteUrl("blog-details", new { title = item.Title, id = item.Id });
// returns correct link of https://example.org/us/blog/some-title-6 in 2.2 but is blank in 3.0
[Route("~/{lang}/blog/{title}-{id}", Name= "blog-details")]
public async Task<IActionResult> Details(string title, int id)
{
}
После обновления до 3.0 эти URL-адреса просто создают пустой href. Наш startup.cs
выглядит следующим образом:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddControllersWithViews(options =>
{
options.Filters.Add(new MiddlewareFilterAttribute(typeof(LocalizationPipeline)));
})
.AddViewLocalization(LanguageViewLocationExpanderFormat.SubFolder)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
services.AddRazorPages();
...
}
Мы попытались заменить на ниже, но это создает неправильную ссылку и не позволяет нам повторно использовать в качестве переменной, например:
<a asp-action="Details" asp-controller="Blog" asp-route-title="item.Title" asp-route-id="@item.Id">Link here</a>
url = Url.Action("Details", "Blog", new { id = item.Id, title = item.Title });
url = Url.RouteUrl(new { action = "Details", controller = "Blog", id = item.Id, title = item.Title });
// all returns https://example.org/us/blog/details/6?title=some-title
<a asp-controller="Home" asp-action="Pricing">Pricing</a>
// returns https://example.org/us/home/pricing instead of correct https://example.org/us/pricing
[Route("~/{lang}/pricing")]
public async Task<IActionResult> Pricing()
{
...
}
Это работает, однако:
<a asp-controller="Signup" asp-action="Customer">Sign up</a>
// returns correct https://example.org/us/signup/customer
[Route("~/{lang}/signup/customer")]
public IActionResult Customer()
{
...
}
Что мы делаем неправильно, если мы хотим использовать маршрутизацию EndPoint (а не старый 2.2-way)?