生成一个参数替换的路由

时间:2018-02-02 10:00:12

标签: c# asp.net-mvc .net-core url-routing asp.net-mvc-routing

我创建了一个网站,通过我的路线中的第一个参数进行本地化。因此,每个网址看起来都是/{lang}/...,其中lang为nl, en, fr, ...

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

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

但是,当前路由包含其他路由参数时,生成的URL都会消失。有没有办法告诉路由生成器保留新URL的所有其他现有路由参数?

我有不同的路径定义和不同的参数,所以不可能手动将它们添加到生成的URL中。

2 个答案:

答案 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

所有其他路由值都会从当前请求中转移,因此在生成网址时会自动重复使用它们,但这对actionIF 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>
}