我创建了一个网站,通过我的路线中的第一个参数进行本地化。因此,每个网址看起来都是/{lang}/...
,其中lang为nl, en, fr, ...
。
在我的标题中,我想添加一个语言选择器,以所选语言重定向到当前页面。我使用了下面的代码,它运行得很好。
<a asp-route-lang="@lang.Code.ToString()">
@lang.Name
</a>
但是,当前路由包含其他路由参数时,生成的URL都会消失。有没有办法告诉路由生成器保留新URL的所有其他现有路由参数?
我有不同的路径定义和不同的参数,所以不可能手动将它们添加到生成的URL中。
答案 0 :(得分:1)
至少,您需要在根据路由构建网址时指定action
和@{
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
和IF Object_id('tempdb..#temp_sar') IS NOT NULL
DROP TABLE #temp_sar
go
CREATE TABLE #temp_table
(
[table_name] VARCHAR,
[column_name] VARCHAR
)
DECLARE @Table_Name VARCHAR
DECLARE @Column_Name VARCHAR
DECLARE @Search_Value UNIQUEIDENTIFIER = CONVERT(UNIQUEIDENTIFIER, '303D9191-E201-4299-809E-FC7B0213F73C')
DECLARE @CURSOR CURSOR
SET @CURSOR = CURSOR scroll FOR
(SELECT s.table_name,
s.column_name
FROM information_schema.columns s
WHERE s.data_type = 'uniqueidentifier')
OPEN @CURSOR
FETCH next FROM @CURSOR INTO @Table_Name, @Column_Name
WHILE @@FETCH_STATUS = 0
BEGIN
IF @Search_Value = EXEC ('select distinct' + @Column_Name + 'from'
+ @Table_Name + 'where' + @Column_Name + '='
+ @Search_Value)
INSERT INTO #temp_table ([table_name], [column_name])
VALUES (@Table_Name, @Column_Name)
FETCH next FROM @CURSOR INTO @Table_Name, @Column_Name
END
CLOSE @CURSOR
SELECT * FROM #temp_table;
无效。
答案 1 :(得分:1)
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>
}