asp.net-core-mvc - 根据文化和会话状态值加载资源文件
问题描述
我需要根据文化 [Lauguage] 和特定的会话值更改 .Net 核心 mvc Web 应用程序的内容,该会话值将根据下拉选择进行设置。
我有一个州 [PA、VA、.. 等] 的下拉列表,因此创建了资源文件 viewname.PA.en.resx、viewname.VA.en.resx。
需要根据我的下拉选择和语言文化加载适当的资源文件。
目前它只是基于加载的语言文化。
解决方案
您可以使用以下代码创建一个 _SelectLanguagePartial.cshtml 部分视图:
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Home"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> <select name="culture"
onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
</select>
</form>
</div>
然后,将Views/Shared/_SelectLanguagePartial.cshtml
文件添加到布局文件的页脚部分,以便所有视图都可以使用它:
<div class="container body-content" style="margin-top:60px">
@RenderBody()
<hr>
<footer>
<div class="row">
<div class="col-md-6">
<p>© @System.DateTime.Now.Year - Localization</p>
</div>
<div class="col-md-6 text-right">
@await Html.PartialAsync("_SelectLanguagePartial")
</div>
</div>
</footer>
</div>
然后,在 Home Controller SetLanguage 方法中,设置文化 cookie。
[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);
}
[注意] 您不能将 _SelectLanguagePartial.cshtml 插入此项目的示例代码。GitHub 上的 Localization.StarterWeb 项目具有通过依赖注入容器将 RequestLocalizationOptions 流向 Razor 部分的代码。检查Startup.cs。
推荐阅读
- simulation - Anylogic问题:一台机器上两个操作时间不同的操作员
- java - 我在firebase中使用了谷歌登录身份验证,现在我想显示当前用户保存但它不工作的数据
- c# - 如何反编译 .dll 文件代码和注释
- django - Django:“用户”对象没有属性“perfil_de_usuario”
- c++ - Srand 正在输出一个巨大的数字列表,而不仅仅是一个
- database - Postgres 转储数据库
- python - 如何简单地编码和编码字典问题的重复性
- php - 无法访问对象中的日期值
- python - Keras iterator with augmented images and other features
- excel - Excel VBA 中的 TAB 事件问题