ASP.NET Core 3.0 Razor页面中的路由本地化 操作方法演示:

我想在我的ASP.NET Core 3.0 Razor Pages应用程序中使用路由本地化。

https://stackoverflow.com/a/52976625/107718似乎有针对2.2的解决方案,但由于3.0中有重新设计的路由/端点,是否有更好的方法可以在3.0中实现呢?

bonwemeters 回答:ASP.NET Core 3.0 Razor页面中的路由本地化 操作方法演示:

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中间件并配置区域性路由,以便它可以正确获取区域性信息:

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?}");
});

请注意,上述订单很重要。

演示:

enter image description here


[编辑]

对不起,我没有注意到您要剃刀页面。要使用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("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?}");
});

本文链接:https://www.f2er.com/3155746.html

大家都在问