替换一个参数生成路由

Generate route with one parameter replaced

我创建了一个网站,其中本地化是通过我的路线中的第一个参数完成的。所以每个 URL 看起来像 /{lang}/...,而 lang 是 nl, en, fr, ....

在我的页眉中,我想添加一个语言选择器,用于重定向到所选语言的当前页面。我使用了下面的代码,它运行良好。

<a asp-route-lang="@lang.Code.ToString()">
    @lang.Name
</a>

但是,当当前路由包含其他路由参数时,这些对于生成的URL都没有了。有什么方法可以告诉路由生成器为新 URL?

保留所有其他现有路由参数

我有不同参数的不同路由定义,因此无法将它们手动添加到生成的 URL 中。

在构建基于路由的URL时,至少需要指定controlleraction。由于对于这种特殊情况(选择文化),它们可能会根据 URL 发生变化,您需要从当前请求中提取这些值。

@{
var routeValues = this.ViewContext.RouteData.Values;
var controller = routeValues["controller"] as string;
var action = routeValues["action"] as string;
}
<ul>
    <li><a asp-controller="@controller" asp-action="@action" asp-route-lang="en">English</a></li>
    <li><a asp-controller="@controller" asp-action="@action" asp-route-lang="es">Español</a></li>
</ul>

所有其他路由值都从当前请求中继承,因此在生成 URL 时会自动重用它们,但这不适用于 controlleraction .

NightOwl888 的回答让我想到了如何解决这个问题。

我从当前上下文中获取 RouteData 并将其用作路由生成器的基础。在我的 foreach 循环中,我用我需要的参数覆盖 lang 参数。

现在我可以使用 Url.Action() 函数和这些数据来生成正确的 URL。

@{
    var routeValues = this.ViewContext.RouteData.Values;
    var controller = routeValues["controller"] as string;
    var action = routeValues["action"] as string;
}

@foreach (var lang in Model.SiteLanguages)
{
    routeValues["lang"] = lang.Code.ToString();

    <a href="@Url.Action(action, controller, routeValues)">
        @lang.Name.UcFirst()
    </a>
}