【问题标题】:Can not get url with query string when changing culture更改文化时无法获取带有查询字符串的 url
【发布时间】:2020-04-06 15:09:09
【问题描述】:
当我将语言从英语更改为德语时,

文化信息没有得到查询字符串。

Startup.cs

 services.Configure<RequestLocalizationOptions>(options =>
          {
                    var supportedCultures = new[]
                    {
                                new CultureInfo("de-DE"),
                                new CultureInfo("en-US"),
                    };
                options.DefaultRequestCulture = new RequestCulture(culture: "de-DE", uiCulture: "de-DE");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
                options.RequestCultureProviders = new List<IRequestCultureProvider>
            {
                new QueryStringRequestCultureProvider(),
                new CookieRequestCultureProvider()
            };
        });

当url中没有查询字符串时,它可以正常工作。但我想用完整的查询字符串返回那个特定的 url。我写了一个方法来设置这样的文化:

    [HttpPost]
    public IActionResult SetLanguage(string culture, string returnUrl)
    {
        Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
            new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
        );

        return LocalRedirect(returnUrl);
    }

_Layout.cshtml

 <form id="selectLanguage" asp-controller="Home"
       asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
       method="post" class="form-horizontal" role="form">
     <select name="culture" onchange="this.form.submit();"
             asp-for="@requestCulture.RequestCulture.UICulture.Name" 
             asp-items="cultureItems">
     </select>
 </form>

当我更改lang 时,它会创建一个如下所示的网址:

我怎样才能得到这样的完整查询字符串:

【问题讨论】:

    标签: cultureinfo asp.net-core-2.2 asp.net-core-localization


    【解决方案1】:

    尝试更改您的returnUrl,如下所示:

    var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value+Context.Request.QueryString.Value}";
    

    【讨论】:

      【解决方案2】:

      我建议采用以下解决方案,因为当您的 url 包含路径库时(例如,当您在 IIS 中使用虚拟路径托管服务时就是这种情况),接受的方法不起作用:

      returnUrl = UriHelper.BuildRelative(Context.Request.PathBase, Context.Request.Path, Context.Request.QueryString)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-21
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2017-05-17
        • 2014-05-21
        相关资源
        最近更新 更多