Razor Pages
Primary docs:
- https://learn.microsoft.com/aspnet/core/razor-pages/
- https://learn.microsoft.com/aspnet/core/tutorials/razor-pages/
Choose Razor Pages For Page-Centered Apps
Prefer Razor Pages when requests naturally map to pages, forms, and page-level handlers. This is a strong default for internal tools, CRUD apps, account flows, and admin surfaces.
Core Shape
Enable Razor Pages with:
builder.Services.AddRazorPages();app.MapRazorPages();
Use the @page directive to turn a .cshtml file into an endpoint. Keep request logic in the paired PageModel class when the page is more than trivial.
Routing Model
- File system location defines the route by default
Pages/Index.cshtmlmaps to/Pages/Store/Index.cshtmlmaps to/Store- Keep folder structure meaningful because it becomes the URL structure
PageModel Guidance
- Use
OnGet,OnPost, and named handlers for request processing - Use bindable properties and model validation for forms
- Keep page models thin; move business logic into injected services
- Use Tag Helpers and model binding instead of manual request parsing
Good Fits
- form-heavy workflows
- dashboards and back-office applications
- simple content with server-side validation
- applications where a page is the primary navigation unit
Key Limitation
Do not rely on per-handler authorization with Razor Pages. Microsoft explicitly recommends using MVC controllers when different handlers on the same logical surface need different authorization behavior.
Preferred responses to that limitation:
- split the handlers into separate pages
- move the surface to MVC if action-level authorization is a better fit
Organizational Guidance
- Group related pages into folders
- Use partial views for repeated fragments
- Use areas only when the application has clear bounded sections
- Keep shared layout and page conventions centralized