ASP.NET 核心 3.0 Razor 页面中的路由本地化
Routed localization in ASP.NET Core 3.0 Razor Pages
我想在我的 ASP.NET Core 3.0 Razor Pages 应用程序中使用路由本地化。
似乎有 2.2 的解决方案,但在 3.0 中有没有更好的方法,既然它已经 routing/endpoints 重新设计了?
ASP.NET Core 3.0 引入了端点路由的新特性,通过它我们可以在路由数据进入 MVC 之前从路由数据中获取文化。这使我们能够根据当前路线对内容进行本地化,而不需要太多努力。
操作方法
首先,确保本地化服务已注册并且您已按如下方式配置支持的文化:
services.AddLocalization(opts => opts.ResourcesPath = "Resources" );
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
// ... others
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
然后添加一个UseRequestLocalization
中间件并为culture配置一个路由,这样它就可以正确获取culture信息:
app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
注意上面的订单很重要。
演示:
[编辑]
抱歉,我没有注意到您要的是 Razor 页面。要使用 Razor Page WebApp,创建一个自定义 IPageRouteModelConvention
来映射路由:
public class CustomCultureRouteRouteModelConvention : IPageRouteModelConvention
{
public void Apply(PageRouteModel model)
{
List<SelectorModel> selectorModels = new List<SelectorModel>();
foreach (var selector in model.Selectors.ToList())
{
var template = selector.AttributeRouteModel.Template;
selectorModels.Add(new SelectorModel(){
AttributeRouteModel = new AttributeRouteModel
{
Template = "/{culture}" + "/" + template
}
});
}
foreach(var m in selectorModels){
model.Selectors.Add(m);
}
}
}
并添加此页面约定:
services.AddRazorPages().AddRazorPagesOptions(opts =>
{
opts.Conventions.Add(new CustomCultureRouteRouteModelConvention());
});
services.AddLocalization(opts => opts.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
new CultureInfo("zh"),
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
中间件:
app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
//endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
//endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
我想在我的 ASP.NET Core 3.0 Razor Pages 应用程序中使用路由本地化。
似乎有 2.2 的解决方案,但在 3.0 中有没有更好的方法,既然它已经 routing/endpoints 重新设计了?
ASP.NET Core 3.0 引入了端点路由的新特性,通过它我们可以在路由数据进入 MVC 之前从路由数据中获取文化。这使我们能够根据当前路线对内容进行本地化,而不需要太多努力。
操作方法
首先,确保本地化服务已注册并且您已按如下方式配置支持的文化:
services.AddLocalization(opts => opts.ResourcesPath = "Resources" );
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
// ... others
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
然后添加一个UseRequestLocalization
中间件并为culture配置一个路由,这样它就可以正确获取culture信息:
app.UseRouting(); app.UseRequestLocalization(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
注意上面的订单很重要。
演示:
[编辑]
抱歉,我没有注意到您要的是 Razor 页面。要使用 Razor Page WebApp,创建一个自定义 IPageRouteModelConvention
来映射路由:
public class CustomCultureRouteRouteModelConvention : IPageRouteModelConvention
{
public void Apply(PageRouteModel model)
{
List<SelectorModel> selectorModels = new List<SelectorModel>();
foreach (var selector in model.Selectors.ToList())
{
var template = selector.AttributeRouteModel.Template;
selectorModels.Add(new SelectorModel(){
AttributeRouteModel = new AttributeRouteModel
{
Template = "/{culture}" + "/" + template
}
});
}
foreach(var m in selectorModels){
model.Selectors.Add(m);
}
}
}
并添加此页面约定:
services.AddRazorPages().AddRazorPagesOptions(opts =>
{
opts.Conventions.Add(new CustomCultureRouteRouteModelConvention());
});
services.AddLocalization(opts => opts.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]{
new CultureInfo("en-US"),
new CultureInfo("de"),
new CultureInfo("it"),
new CultureInfo("zh"),
};
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
中间件:
app.UseRouting();
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
//endpoints.MapControllerRoute(name: "culture-route", pattern:"{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
//endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});