假设我有一个 ASP.NET Core 7 MVC 项目,其中支持页面和视图。如果页面和视图指向同一端点,则哪一个优先,为什么?因此,为了进一步扩展,我有一个 Razor 类库,其中包含位于
Pages >> Account >> Login.cshtml
的 Razor 页面(以及代码隐藏文件 Login.cshtml.cs
)。
这旨在充当“默认”登录行为。同时,我在
AccountController
内设置了一个控制器操作,看看是否可以覆盖该页面。但页面似乎总是优先。
这是我的代码:
Program.cs
builder.Services.AddMvc();
builder.Services.AddRazorPages().AddRazorRuntimeCompilation();
// ...
app.MapControllerRoute(name: "area-default", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(name: "page", pattern: "Page/{slug?}", defaults: new { controller = "CustomPage", action = "Details" });
app.MapControllerRoute(name: "form", pattern: "Form/{slug?}", defaults: new { controller = "FormController", action = "Custom" });
// I incorrectly assumed that by placing this after the controller routes, the MVC routes would take precedence
app.MapRazorPages();
AccountController.cs
:
using Microsoft.AspNetCore.Mvc;
namespace RazorClassLibrary.Controllers
{
public class AccountController : Controller
{
[HttpGet]
public IActionResult Login()
{
return Content("This is an override from the RCL.");
}
}
}
当我注释掉
app.MapRazorPages()
行时,MVC 路由就会按预期启动。但如果该行存在,页面始终会胜过控制器操作。
我的目标是让控制器操作覆盖页面。这可能吗?有什么想法吗?
在 ASP.NET Core 中,Razor Pages 框架默认优先于 MVC 控制器。这意味着,如果 Razor 页面和控制器操作都针对同一端点,则将调用 Razor 页面而不是控制器操作。
要使控制器操作优先于 Razor 页面,您可以配置路由以将 MVC 控制器优先于 Razor 页面。您可以通过修改路由约定来实现这一点。
实现此目的的一种方法是使用端点路由中间件并相应地配置路由约定。具体方法如下:
// In your ConfigureServices method in Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddRazorPages().AddRazorRuntimeCompilation();
}
// In your Configure method in Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Add endpoint routing
app.UseRouting();
// Add middleware to handle endpoints
app.UseEndpoints(endpoints =>
{
// Map controllers with attribute routing
endpoints.MapControllers();
// Map Razor Pages
endpoints.MapRazorPages();
});
// Other middleware configurations...
}
通过此配置,MVC 控制器将在 Razor 页面之前映射,因此控制器操作将优先于针对同一端点的 Razor 页面。
通过使用此方法,您的控制器操作现在应该覆盖指定端点的 Razor 页面。