将子文件夹路由到根 URL

Posted

技术标签:

【中文标题】将子文件夹路由到根 URL【英文标题】:Routing subfolder to root URLs 【发布时间】:2021-08-09 18:10:20 【问题描述】:

在 Razor 页面项目中,我必须覆盖 ASP.NET 标识的默认 UI。除了特定的页面要求之外,我不想要像“/Identity/Account/Whatever”这样的网址 - 我的页面将是 /login、/logout 等。

但是我仍然想将身份验证页面分组到一个子文件夹中(不要污染顶部文件夹),而是从“根”URL 提供它们。

...
Pages
  /Auth
    Login.cshtml           -> /login
    Logout.cshtml          -> /logout
    ResetPassword.cshtml   -> /resetpassword
    ...
  Index.cshtml
  Privacy.cshtml
...

目前为了实现这一点,我的 Startup.cs 中有以下代码

services.AddRazorPages(options =>

  options.Conventions.AddPageRoute("/Auth/Login", "login");
  options.Conventions.AddPageRoute("/Auth/Logout", "logout");
  options.Conventions.AddPageRoute("/Auth/ResetPassword", "resetpassword");
  ...
);

Can this be achieved with folder convention? Also I don't want to have /auth/page URLs still working (which is a problem with the current approach).

【问题讨论】:

嗨@Georg,关于这个案例有什么更新吗? 【参考方案1】:

您可以通过自定义Page route action convention 来实现此目的。

您可以像下面这样更改您的代码。

 services.AddRazorPages(options =>
                
                    options.Conventions.AddPageRoute("/Auth/Login", "login");
                    options.Conventions.AddPageRoute("/Auth/Logout", "logout");
                    options.Conventions.AddPageRoute("/Auth/ResetPassword", "resetpassword");
                    options.Conventions.AddFolderRouteModelConvention("/", model =>
                    
                        var selectorCount = model.Selectors.Count;
                        for (var i = selectorCount - 1; i >= 0; i--)
                        
                            var selectorTemplate = model.Selectors[i].AttributeRouteModel.Template;

                            if (selectorTemplate.StartsWith("Auth")) 
                                model.Selectors.RemoveAt(i);
                        
                    );
                );

【讨论】:

以上是关于将子文件夹路由到根 URL的主要内容,如果未能解决你的问题,请参考以下文章

PHP DOM 将子元素附加到根

Laravel 在单击带有 # 的链接时将“!#”添加到根 URL

Laravel 路由问题:自动重定向到根文件夹

Rails:将所有未知路由重定向到 root_url

将子文件夹重定向到 Wordpress 而不显示 URL

使用htaccess从URL中删除公用文件夹