【问题标题】:@Page Route for All Pages under a folder文件夹下所有页面的@Page Route
【发布时间】:2020-09-13 05:58:40
【问题描述】:

我只是学习 ASP.NET Core Razor Pages 并且主要熟悉 ASP.NET Web 窗体。我有一个名为 Dashboard 的文件夹,其中包含多个剃须刀页面。我知道在每一页的顶部我可以添加以下 @Page "{CONID}" 。我的应用程序需要一个连接 ID,用于我的页面来识别我在查询数据时需要的数据库连接,这是根据用户选择的连接从我的登录页面传递的。

问题是,我怎样才能将这个@Page "{CONID}" 应用到我在Dashboard 文件夹或其他文件夹中的所有页面,而不必在每个页面的顶部添加它?那可能吗?我将有许多页面和许多不同的文件夹,它们都有这个要求。

【问题讨论】:

  • 我已经给你回复了,你可以试试这个代码,如果你有其他问题,请告诉我,如果没有,你可以接受它作为答案。
  • 对不起。真的很忙,没有机会尝试一下。

标签: asp.net-core razor-pages


【解决方案1】:

如何将此@Page "{CONID}" 应用于仪表板中的所有页面 文件夹或其他文件夹,而无需将其添加到每个文件夹的顶部 页?这可能吗?

是的,有可能。

在startup.cs文件的ConfigureServices,注册AddRazorPagesOptions's Conventions.AddFolderRouteModelConvention即可实现你的需求。

首先,将所有文件夹名称放在一个字符串数组中,然后循环该数组以将 AttributeRouteModel.CombineTemplates 添加到每个文件夹的PageRouteModel.Selectors 如下:

services
       .AddMvc()
       .AddRazorPagesOptions(options =>
       {
           var folders = new string[] { "/Dashboard", "/Courses" };//you can add more folders
           for (int k = 0; k < folders.Length; k++)
           {
               options.Conventions.AddFolderRouteModelConvention(folders[k], 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 = 2,
                               Template = AttributeRouteModel.CombineTemplates(
                                   selector.AttributeRouteModel.Template,
                                   "{CONID?}"),
                           }
                       });
                   }
               });
           }

       });

你也可以看看this

这是测试结果:

【讨论】:

  • 这不起作用。它将它添加到路由中,我想让它成为必需的模板 {CONID},但它会将它添加到选择器中。所以路由 /Dashboard 和 /Dashboard/Index 和 /Dashboard/Index/SOMECONNECTION 一样有效。我只希望 /Dashboard/Index/SOMECONNECTION 工作。
  • 感谢您为我指明了正确的方向。像往常一样,Microsoft 文档会将您引向一个充满未知数的兔子洞,您只需不断地戳它,直到出现问题。
【解决方案2】:

我通过修改每个路由模板而不是使用 Add 来实现它,它只是在现有路由模板中添加了另一个模板。

        services.AddRazorPages(options => {
            var folders = new string[] { "/Dashboard" };
            for (int k = 0; k < folders.Length; k++)
            {
                options.Conventions.AddFolderRouteModelConvention(folders[k], model =>
                {
                    var selectorCount = model.Selectors.Count;
                    for (var i = 0; i < selectorCount; i++)
                    {
                        var selector = model.Selectors[i];
                        selector.AttributeRouteModel.Template = 
                        AttributeRouteModel.CombineTemplates(selector.AttributeRouteModel.Template, "{CONID}");
                    }
                });
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多