C# Asp.NET Core 3.1 RazorPages本地化SEO友好URL
我对上述问题做了很多研究,但是我找不到解决问题的正确方法。让我解释一下,我正在使用RazorPages和.Net Core 3.1编写一个应用程序,它是多语言的,我希望它的行为与大多数使用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
这样,我在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
{