asp.net core mvc 和 razor pages 怎么选

来源:这里教程网 时间:2026-02-21 17:38:38 作者:

直接说结论:新项目优先选 Razor Pages,除非你明确需要 MVC 的多视图复用、API 与视图混写、或已有 MVC 架构要延续。

看项目类型:CRUD 管理后台?选
Razor Pages
;多端共用逻辑的复杂系统?考虑
MVC

Razor Pages 天然适合「一个 URL 对应一个页面 + 一套增删改查逻辑」的场景,比如:

/Pages/Products/Index.cshtml
自动映射到
/Products
,所有查询、分页、表单提交都封装在
Index.cshtml.cs
里。不用建
ProductsController
、再配
Views/Products/Index.cshtml
,省掉 3 个文件夹层级和路由映射脑力消耗。

MVC 更适合这类情况:

多个页面(如
/admin/orders
/api/orders
)共享同一套业务逻辑,靠一个
OrdersController
统一处理
同一个控制器动作要返回不同视图(
View("MobileIndex")
JsonResult
),甚至混合输出 HTML/JSON
团队已维护多年 MVC 项目,迁移成本 > 收益

看路由和组织:文件路径即路由,
@page
[Route]
更少出错

Razor Pages 默认按文件系统推导路由:

/Pages/Customers/Edit.cshtml
/Customers/Edit
,加
@page "/customer/{id:int}"
就能定制。几乎不用碰
Program.cs
里的路由配置。

MVC 路由依赖两层映射:先靠

MapControllerRoute
匹配
{controller=Home}/{action=Index}
,再靠控制器里方法名和
[HttpGet]
特性定位动作。容易踩的坑包括:

控制器命名不带
Controller
后缀(
ProductController
写成
Product
),404
View()
查找视图时默认去
Views/[ControllerName]/[ActionName].cshtml
,但你把视图放错文件夹就报
The view 'Index' was not found
特性路由写错大小写或斜杠(
[Route("products")]
vs
[Route("Products")]
),本地开发可能不敏感,Linux 部署直接 404

看测试和可维护性:逻辑分散是代价,也是解耦优势

Razor Pages 把页面逻辑锁死在

.cshtml.cs
里,单元测试得 mock
PageModel
PageContext
,比测纯服务类麻烦;但好处是改一个页面不会误伤其他页面。

MVC 的控制器天然就是“瘦壳”,业务逻辑通常抽到独立 service 层,

ProductsController
只负责接收参数、调 service、返回
View()
Ok()
—— 这让集成测试更干净,也方便 API 和 Web 视图共用同一套 service。

注意:这不是非此即彼。你完全可以在 Razor Pages 项目里加

Controllers
文件夹写 API,也能在 MVC 项目里加
Pages
文件夹写管理页。ASP.NET Core 允许两者并存,
app.MapRazorPages()
app.MapControllerRoute()
可以同时注册。

新手起步别纠结:用
dotnet new web
模板,不是
dotnet new mvc

dotnet new web
(即 Razor Pages 模板)生成的项目结构更轻:只有
Pages/
wwwroot/
Program.cs
。没有
Controllers/
Views/
Models/
这些目录,也不用理解
IActionResult
ViewResult
的继承链。

dotnet new mvc
一上来就要面对
HomeController.cs
Views/Home/Index.cshtml
Startup.cs
(或
Program.cs
中一堆
AddControllersWithViews()
),对刚从 Python Flask 或 Node.js Express 转来的开发者反而有认知负担。

真正容易被忽略的一点:Razor Pages 的

PageModel
不是控制器,它没有
ViewBag
TempData
的隐式生命周期管理,跨请求传数据得显式用
TempData["key"] = value
,否则刷新就丢 —— 这个细节很多人上线后才踩到。

相关推荐