替换一个参数生成路由
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时,至少需要指定controller
和action
。由于对于这种特殊情况(选择文化),它们可能会根据 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 时会自动重用它们,但这不适用于 controller
和 action
.
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>
}
我创建了一个网站,其中本地化是通过我的路线中的第一个参数完成的。所以每个 URL 看起来像 /{lang}/...
,而 lang 是 nl, en, fr, ...
.
在我的页眉中,我想添加一个语言选择器,用于重定向到所选语言的当前页面。我使用了下面的代码,它运行良好。
<a asp-route-lang="@lang.Code.ToString()">
@lang.Name
</a>
但是,当当前路由包含其他路由参数时,这些对于生成的URL都没有了。有什么方法可以告诉路由生成器为新 URL?
保留所有其他现有路由参数我有不同参数的不同路由定义,因此无法将它们手动添加到生成的 URL 中。
在构建基于路由的URL时,至少需要指定controller
和action
。由于对于这种特殊情况(选择文化),它们可能会根据 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 时会自动重用它们,但这不适用于 controller
和 action
.
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>
}