首页 > 解决方案 > 更改 ASP.NET Core Razor 页面中的默认登录页面?

问题描述

我试过:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.AddPageRoute("/Index", "old");
    options.Conventions.AddPageRoute("/NewIndex", "");
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

抛出此异常:

AmbiguousMatchException:请求匹配多个端点。火柴:

页:/索引

页面:/新索引

我发现了这个,它建议重命名索引页面,但很明显,如果不是一个很好的理由,它是一种解决方法。我不能只更改默认页面而不重命名 /Index 页面吗?

编辑

建议的 SO 线程不涵盖我解释的问题,即覆盖默认路由而无需重命名默认Index页面。接受的答案解决了这个问题。

标签: asp.net-core.net-corerazor-pagesasp.net-core-2.2asp.net-core-routing

解决方案


Razor 页面中的默认页面是那些为其生成了空字符串路由模板的页面。您可以使用自定义删除为Index.cshtmlPageRouteModelConvention页面生成的空字符串路由模板,并将其添加到您希望作为默认页面的任何页面:

public class HomePageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        if(model.RelativePath == "/Pages/Index.cshtml")
        {
            var currentHomePage = model.Selectors.Single(s => s.AttributeRouteModel.Template == string.Empty);
            model.Selectors.Remove(currentHomePage);
        }

        if (model.RelativePath == "/Pages/NewIndex.cshtml")
        {
            model.Selectors.Add(new SelectorModel()
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Template = string.Empty
                }
            });
        }
    }
}

您在 ConfigureServices 中注册约定:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.Add(new HomePageRouteModelConvention());
}).SetCompatibilityVersion(CompatibilityVersion.Latest);

您可以在此处阅读有关自定义页面路由模型约定的更多信息:https ://www.learnrazorpages.com/advanced/custom-route-conventions


推荐阅读