【问题标题】:Generate route with one parameter replaced生成替换一个参数的路由
【发布时间】:2018-07-12 19:20:19
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    在构建基于路由的 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。

    【讨论】:

    • 这仍然给了我相同的结果。
    • 您的路线是如何设置的?我在从 Visual Studio MVC 模板构建的 MVC Core 项目中运行它并将默认路由更改为 {lang}/{controller=Home}/{action=Index}/{id?} - 工作正常。
    • 另请注意,查询字符串值不会像路由值那样从当前请求自动传递。
    【解决方案2】:

    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>
    }
    

    【讨论】:

    • 不知道为什么我提供的选项不起作用,但这样做肯定没有错。 +1。
    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多