.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.LoginModel
到Index.cshtml
。您可以将其发布为答案,以便我将其标记为正确答案吗?谢谢
【参考方案1】:
我认为你每次都被重定向到登录,因为你没有登录。这可以解释这种情况。
然后你正在调试“登录”,而你认为你正在调试“索引”,这可能会非常令人困惑。
这也发生在我身上,你认为你正在调试一个请求,但事实证明你正在调试另一个请求(在我的情况下,我实际上是在调试一个对 'favicon.ico' 的请求,VS 在没有我的情况下发送知识)。
【讨论】:
好吧,在我的案例中,这是第一个请求的调试,但同事将继承自PageModel
的 LoginModel
的依赖添加到 Index.cshtml
中。当PageModel
的孩子被构造时,它会自动调用 OnGet 方法。以上是关于.net 5 剃须刀页面路由的主要内容,如果未能解决你的问题,请参考以下文章
ASP.net core 3.1 中控制器和剃须刀页面之间的路由
路由覆盖在 asp.net core 3.1 剃须刀页面中不起作用