使用ASP.NET Core 2.1的本地化页面名称

时间:2018-09-13 16:02:24

标签: asp.net-core asp.net-core-2.1 razor-pages

在创建“剃刀”页面时,例如“ Events.cshtml”,将其模型名称设置为

@page
@model EventsModel

在这种情况下,页面的名称是“事件”,URL看起来像

http://example.com/Events

为了能够使用挪威语中的页面名称,我在“ Startup.cs”中添加了以下内容

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .AddRazorPagesOptions(options => {
        options.Conventions.AddPageRoute("/Events", "/hvaskjer");
        options.Conventions.AddPageRoute("/Companies", "/bedrifter");
        options.Conventions.AddPageRoute("/Contact", "/kontakt");
});

与此同时,我也可以使用这样的网址,并继续投放“事件”页面

http://example.com/hvaskjer

我打算支持更多的语言,并且想知道,这是设置本地化页面名称/路由的推荐方法吗?还是有一种更正确的正确方法来实现。

我的意思是,对于上面的示例,它以10种语言显示了15页,使用options.Conventions.AddPageRoute("/Page", "/side"); 150次会变得混乱。

1 个答案:

答案 0 :(得分:3)

您可以使用IPageRouteModelConvention界面执行此操作。它提供了对PageRouteModel的访问权限,您可以在其中有效地添加更多的路由模板以匹配特定页面。

这是基于以下服务和模型的非常简单的概念证明:

public interface ILocalizationService
{
    List<LocalRoute> LocalRoutes();
}
public class LocalizationService : ILocalizationService
{
    public List<LocalRoute> LocalRoutes()
    {
        var routes = new List<LocalRoute>
        {
            new LocalRoute{Page = "/Pages/Contact.cshtml", Versions = new List<string>{"kontakt", "contacto", "contatto" } }
        };
        return routes;
    }
}

public class LocalRoute
{
    public string Page { get; set; }
    public List<string> Versions { get; set; }
}

它所做的只是提供特定页面的选项列表。 IPageRouteModelConvention实现看起来像这样:

public class LocalizedPageRouteModelConvention : IPageRouteModelConvention
{
    private ILocalizationService _localizationService;

    public LocalizedPageRouteModelConvention(ILocalizationService localizationService)
    {
        _localizationService = localizationService;
    }

    public void Apply(PageRouteModel model)
    {
        var route = _localizationService.LocalRoutes().FirstOrDefault(p => p.Page == model.RelativePath);
        if (route != null)
        {
            foreach (var option in route.Versions)
            {
                model.Selectors.Add(new SelectorModel()
                {
                    AttributeRouteModel = new AttributeRouteModel
                    {
                        Template = option
                    }
                });
            }
        }
    }
}

在启动时,Razor页面会构建应用程序的路由。对框架找到的每个可导航页面执行Apply方法。如果当前页面的相对路径与您的数据中的相对路径匹配,则会为每个选项添加一个附加模板。

您在ConfigureServices中注册了新约定:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.Add(new LocalizedPageRouteModelConvention(new LocalizationService()));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);