【发布时间】:2018-03-11 20:09:35
【问题描述】:
我创建了一个带有剃须刀页面的 ASP.NET Core 2 项目,我希望让访问者有机会选择一种语言。我遇到的第一个问题是更改 Web 应用程序 url,以便 ti 包含当前语言代码。我通过在 ConfigureServices 中添加以下代码解决了这个问题。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/Account/Manage");
options.Conventions.AuthorizePage("/Account/Logout");
options.Conventions.AddFolderRouteModelConvention("/", model =>
{
foreach (var selector in model.Selectors)
{
var attributeRouteModel = selector.AttributeRouteModel;
attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{language=el-GR}", attributeRouteModel.Template);
}
});
});
}
}
现在我可以使用以下 URL 访问页面:
http://domain/el-GR/MyPage
我最不想做的就是改变每个请求的文化。我发现我不喜欢的最佳解决方案是将以下代码放在我的页面中:
System.Globalization.CultureInfo.CurrentCulture = new System.Globalization.CultureInfo((string)RouteData.Values["language"]);
System.Globalization.CultureInfo.CurrentUICulture = new System.Globalization.CultureInfo((string)RouteData.Values["language"]);
这不好,因为我将不得不在我将在我的项目中创建的每个剃须刀页面中添加这些谎言。
还有其他方法可以为我的 Web 应用程序的所有请求设置文化吗?
【问题讨论】:
-
您是否查看过 .NET Core 中的本地化文档? docs.microsoft.com/en-us/aspnet/core/fundamentals/localization
-
感谢迈克的回复。我的问题是我为我的 PageModel 类使用了 MiddlewareFilter 并且它有效,但我必须为我的所有剃须刀页面这样做。我只是想找到一种方法来定义它一次并将其应用于整个应用程序,这样我就不必为我的项目的每个 PageModel 放置相同的属性。
-
您是否尝试过使用该属性创建一个 BasePageModel 并让您的所有 PageModel 类都继承自该属性?
-
我已经尝试过了,它可以工作,但正如我在之前的消息中告诉你的那样,我想声明一次并将其应用于所有请求。如果我创建一个 BasePageModel,我将不得不更改所有用于定义页面模型的文件。
-
查看一篇关于将本地化放在 _Layout.cshtml 中并使用 Controller 代替 PageModel stackoverflow.com/questions/54621274/form-in-layout-razor-pages/… 的帖子
标签: asp.net-core-2.0 razor-pages