【问题标题】:Route Data in razor page剃刀页面中的路由数据
【发布时间】:2020-07-09 21:48:21
【问题描述】:

剃刀页面是否支持 MVC?

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

我需要在页面 url 前面加上一个前缀:

/prefix/Index

/prefix/Privacy 

我可以访问路线数据,只是不知道如何将其映射到剃须刀页面

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core razor-pages


    【解决方案1】:

    要在剃须刀页面中实现它,首先创建一个继承自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());
            });
         }
    

    这里指的是here

    更新:

    要动态生成“前缀”,您可以将“前缀”更改为{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);
            }
        }
    }
    

    结果如下:

    【讨论】:

    • 好的,这样的作品,模板=“/{前缀}”+“/”+模板,我现在如何生成链接以跟随添加的前缀?注意前缀是动态的,不是硬编码的
    • 在 MVC 中,一旦您应用了这样的内容:localhost:44306/Test/Index - 所有链接都将遵循测试前缀,当您将鼠标悬停在隐私上时,它将转到 localhost:44306/Test/Privacy
    • @Seeker 我已经根据你的要求更新了我的帖子,你可以试试。
    • "prefix" 是动态的,可以是 test1/privacy, test2/privacy, test3/privacy 然后我使用路由值来显示数据
    • @Seeker 我已经更新了我的帖子,希望它能解决你的问题。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2023-03-26
    • 2020-05-30
    • 2018-12-04
    • 2021-10-06
    • 2020-07-11
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多