Данные маршрута на странице бритвы - PullRequest
0 голосов
/ 29 марта 2020

Поддерживается ли это из MVC на страницах бритвы?

endpoints.MapControllerRoute(
                    name: "prefix",
                    pattern: "{prefix}/{controller=Home}/{action=Index}/{id?}");

Мне нужен префикс перед URL страницы:

/prefix/Index

/prefix/Privacy 

Я могу получить доступ к данным маршрута, просто не знаю, как сопоставить его со страницей бритвы

1 Ответ

1 голос
/ 30 марта 2020

Чтобы реализовать его на бритвенных страницах, сначала создайте класс, который наследуется от IPageRouteModelConvention

public class CustomRouteModelConvention : 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 = "/prefix" + "/" + template
                }
            });
        }
        foreach (var m in selectorModels)
        {
            model.Selectors.Add(m);
        }
    }
}

Затем, в методе startup.cs ConfigureServices, добавьте этот код:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages().AddRazorPagesOptions(opts =>
        {
            opts.Conventions.Add(new CustomRouteModelConvention());
        });
     }

Это относится к здесь .

Обновление:

Для динамического создания префикса вы можете изменить префикс на {0} для замены любой введенной вами строки.

public class CustomRouteModelConvention : 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 = "/{0}" + "/" + template
                }
            });
        }
        foreach (var m in selectorModels)
        {
            model.Selectors.Add(m);
        }
    }
}

Вот результат:

enter image description here

...