Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.NET Core 3.1 RazorPages本地化SEO友好URL_C#_Asp.net Core_Localization_Razor Pages - Fatal编程技术网

C# Asp.NET Core 3.1 RazorPages本地化SEO友好URL

C# Asp.NET Core 3.1 RazorPages本地化SEO友好URL,c#,asp.net-core,localization,razor-pages,C#,Asp.net Core,Localization,Razor Pages,我对上述问题做了很多研究,但是我找不到解决问题的正确方法。让我解释一下,我正在使用RazorPages和.Net Core 3.1编写一个应用程序,它是多语言的,我希望它的行为与大多数使用SEO友好URL和本地化的网站一样,例如: 这样,我在URI路径中有一个区域性参数,并使用它以正确的语言显示我的页面 我试图在Startup中添加以下内容: public void ConfigureServices(IServiceCollection services) { services.C

我对上述问题做了很多研究,但是我找不到解决问题的正确方法。让我解释一下,我正在使用RazorPages和.Net Core 3.1编写一个应用程序,它是多语言的,我希望它的行为与大多数使用SEO友好URL和本地化的网站一样,例如:


这样,我在URI路径中有一个区域性参数,并使用它以正确的语言显示我的页面

我试图在Startup中添加以下内容:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<RequestLocalizationOptions>(options =>
    {
        var supportedCultures = new[]
        {
            new CultureInfo("en"),
            new CultureInfo("de"),
            new CultureInfo("fr"),
            new CultureInfo("es"),
            new CultureInfo("ru"),
            new CultureInfo("ja"),
            new CultureInfo("ar"),
            new CultureInfo("zh"),
            new CultureInfo("en-GB")
        };
        options.DefaultRequestCulture = new RequestCulture("en-GB");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
        options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider(){ Options = options});
    });


    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddRazorPages(options =>
    {
        options.Conventions.Add(new CultureTemplatePageRouteModelConvention());
    })
    .AddViewLocalization();
}
public void配置服务(IServiceCollection服务)
{
配置(选项=>
{
var supportedCultures=new[]
{
新文化信息(“en”),
新文化信息(“de”),
新文化资讯(“fr”),
新文化信息(“es”),
新文化信息(“ru”),
新文化信息(“ja”),
新文化信息(“ar”),
新文化资讯(“zh”),
新文化信息(“en GB”)
};
options.DefaultRequestCulture=新的RequestCulture(“en GB”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
Insert(0,新RouteDataRequestCultureProvider(){options=options});
});
services.AddLocalization(options=>options.ResourcesPath=“Resources”);
services.AddRazorPages(选项=>
{
添加(新的CultureTemplatePageRouteModelConvention());
})
.AddViewLocalization();
}
其中CultureTemplatePageRouteModelConvention为:

public class CultureTemplatePageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;

        for (var i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];

            model.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Order = -1,
                    Template = AttributeRouteModel.CombineTemplates("{culture?}",
                        selector.AttributeRouteModel.Template),
                }
            });
        }
    }
}
公共类CultureTemplatePageRouteModelConvention:IPageRouteModelConvention
{
公共无效应用(PageRouteModel模型)
{
var-selectorCount=model.Selectors.Count;
对于(变量i=0;i
然后添加中间件:

.....
app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();
var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(localizationOptions);

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});
。。。。。
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
var localizationOptions=app.ApplicationServices.GetService().Value;
app.UseRequestLocalization(localizationOptions);
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapRazorPages();
});
但似乎什么都不管用。 你有解决这个问题的办法吗?如果没有,我如何实现我的目标?
谢谢

这是我在项目中所做的,它对我很有用。在Startup.cs文件的ConfigureServices中添加以下代码:

services.AddRazorPages().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("{lang=en-US}", attributeRouteModel.Template);
        }
    });
});

IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
    new CultureInfo("en-US"),
    new CultureInfo("el-GR"),
};

var MyOptions = new RequestLocalizationOptions()
{
    DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
};
MyOptions.RequestCultureProviders = new[]
{
        new RouteDataRequestCultureProvider() { RouteDataStringKey = "lang", Options = MyOptions }
};

services.AddSingleton(MyOptions);
现在,在razor pages类上添加以下属性:

[MiddlewareFilter(typeof(LocalizationPipeline))]
public class ExampleModel : PageModel
{
[MiddlewareFilter(typeof(LocalizationPipeline))]
public class ExampleModel : PageModel
{