.net 5 剃须刀页面路由

Posted

技术标签:

【中文标题】.net 5 剃须刀页面路由【英文标题】:.net 5 razor page routing 【发布时间】:2022-01-07 10:26:36 【问题描述】:

在我们的一个项目 (.NET 5) 中,Razor 页面路由的行为有点奇怪。中间件管道没有什么特别之处:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    
    else
    
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>  endpoints.MapRazorPages(); );

甚至服务也不包含任何额外内容:

public void ConfigureServices(IServiceCollection services)

    string connectionString = Configuration.GetConnectionString("DefaultConnection");
    // for scoped services (mainly for identity)
    services.AddDbContext<DbEntities>(options =>
        options.UseSqlServer(connectionString));

    AddIdentity(services);
    services.AddDatabaseDeveloperPageExceptionFilter();

    services.AddRazorPages()
        .AddRazorRuntimeCompilation();


private void AddIdentity(IServiceCollection services)

    services.AddDefaultIdentity<ApplicationUser>(options =>
        
            options.SignIn.RequireConfirmedAccount = true;

            options.User.RequireUniqueEmail = true;

            options.Password.RequiredLength = 6;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireDigit = false;
            options.Password.RequireLowercase = false;
            options.Password.RequireUppercase = false;

            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Lockout.MaxFailedAccessAttempts = 5;
        )
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<DbEntities>();

    // this is needed because passwords are stored with old hashes
    services.Configure<PasswordHasherOptions>(options =>
        options.CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV2
    );

我们已经搭建了一些身份 RazorPages:

当我们在public async Task OnGetAsync(string? returnUrl = null)ProjectRoot/Areas/Identity/Pages/Account/Login.cshtml.cs 中设置断点并运行项目时,会发生奇怪的事情。

每当我们想在浏览器中访问https://localhost:5001/ 时,就会触发Login.cshtml.cs 中的断点。甚至在ProjectRoot/Pages/Index.cshtml.cs之前。

我们怎样才能找到它为什么会这样?为什么应用程序在Index.cshtml.cs 之前路由到Login.cshtml.cs

在登录断点调试时,上下文值为:

Request.Path = "/"
Request.RouteValues =  ["page"] = "/Index" 

【问题讨论】:

我认为你每次都被重定向到登录,因为你没有登录。 @PoulBak 你是天才。而已!我的同事将此行(以及其他行)添加到@model HlidacStatu.JobsWeb.Areas.Identity.Pages.Account.LoginModelIndex.cshtml。您可以将其发布为答案,以便我将其标记为正确答案吗?谢谢 【参考方案1】:

我认为你每次都被重定向到登录,因为你没有登录。这可以解释这种情况。

然后你正在调试“登录”,而你认为​​你正在调试“索引”,这可能会非常令人困惑。

这也发生在我身上,你认为你正在调试一个请求,但事实证明你正在调试另一个请求(在我的情况下,我实际上是在调试一个对 'favicon.ico' 的请求,VS 在没有我的情况下发送知识)。

【讨论】:

好吧,在我的案例中,这是第一个请求的调试,但同事将继承自 PageModelLoginModel 的依赖添加到 Index.cshtml 中。当PageModel 的孩子被构造时,它会自动调用 OnGet 方法。

以上是关于.net 5 剃须刀页面路由的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net core 3.1 中控制器和剃须刀页面之间的路由

路由覆盖在 asp.net core 3.1 剃须刀页面中不起作用

在剃须刀页面应用程序中路由到 ApiController?

ASP.NET Core 3.1 Razor 页面路由不明确匹配异常

混合 SPA 和 ASP.NET MVC 路由

Blazor WASM 页面路由