gpt4 book ai didi

c# - Url.RouteUrl 在 ASP.NET Core 3.0 中为空

转载 作者:行者123 更新时间:2023-12-03 16:12:37 27 4
gpt4 key购买 nike

我们正在将 ASP.NET Core 2.2 项目升级到使用 EndPoint 路由的 ASP.NET 3.0。

我们有一个由 Url.RouteUrl 构造的大量 url 列表。使用命名路由,例如:

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),我们做错了什么?

最佳答案

有两个项目负责这种行为。

首先,让我们看看路由是如何生成的:

[Route("~/{lang}/pricing")]
{lang} token 是有问题的。人们会期望在从一个页面浏览到另一个页面时——就像在 ASP.Net Core 2.2 下的情况一样——这个值将被保留和重用。现在已经不是这样了。 doc使用 id 证明它是合理的例如: book id 123不应该导致 login user id 123 .不幸的是,这同样适用于更稳定的语言代码 lang .

因此,URL 生成必须包含 lang代码。使用问题中的第一个 URL,它将变为:
string url = Url.RouteUrl("blog-details", new {lang="en", title = item.Title, id = item.Id });

[Route("~/{lang}/blog/{title}-{id}", Name= "blog-details")]

第二项是默认路由。由于缺少 lang 而导致您的路线不匹配参数,使用默认路由。由于您使用了不属于默认路由模板的参数,因此它们被添加到 URL 的末尾 ( ?title=some-title )。如果没有默认路由,则根本不会生成 URL。

有一个有趣的 post关于值得一读的问题。

对于所有读者来说,旁注是,可以提取应该回收的环境值并将其插入链接代:
@{string lang = (string)ViewContext.RouteData.Values["lang"]; }
<a asp-area="" asp-controller="myController" asp-action="myAction" asp-route-lang=@lang >click here</a>

关于c# - Url.RouteUrl 在 ASP.NET Core 3.0 中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58183201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com