前言
在 ASP.NET Core – MVC vs Razor Page 里有提到 MVC. 它算是 WebAPI 的抽象.
但是通常 MVC 指的是比较传统的 Website, WebAPI 则是前后端分离的方案. Razor Page 则是替代 MVC 做 Website 的.
虽然说替代, 但是也不是 100%, 有些场景用 MVC 会比较直观. 这篇就特别来讲一下.
Get Started
dotnet new mvc -o TestMvc
folder 结构
可以 1 Controller 多个 Action, 每一个 Action 对一个 View, 或者 1 Controller 1 Action 对 1 个 View (看想怎样管理)
Controller 找 View
找 View 是有 default path 逻辑的, 也可以自定义. 但这里我就不多介绍了. 因为我使用场景很少, 所以都是直接写 path.
return View("~/PathToView/Index.cshtml", viewModel);
职责
Razor Page 的入口是 View .cshtml 然后引入 Model.cs (这个 Model 又包含了 Init 方法, 所以它算是 Model + Controller 概念)
MVC 的入口是 Controller + Action (.cs) 然后通过 ViewModel passing 资料给 View.
Razor Page View = MVC View
Razor Page Model Init = MVC Controller Action
Razor Page Model = MVC ViewModel
Route
上面讲了 Controller Action 和 View 的关系. 现在讲 Route.
Razor Pages 是通过 View 里面的 @page "url" 来定义 route 的.
MVC 则是直接在 Program.cs 里声明
pattern 可以写一些表达式, 上面的意思是
第一个 segment 对应 controller 名字,
第二个对应 action
第三个是一个 optional 的 RouteData
同时如果 3 个 segment 都是空, 那么就匹配 default 的 Home Index
使用场景
我遇到的场景是这样的
有 services 和 products.
一种做法是 /services, /categories 作为所以 services 和 product categories 页面
然后 /services/service1, /category1/product1 作为 service/product detail 页面.
但是这个项目不打算做 /services 和 product categories 页面.
而是直接让用户去 /service1 或者 /category1
service1 和 category1 是来自 SQL 的 data. route 匹配的写法就是 /{service-or-category}
然后 service 和 category 的页面是不同的设计.
这种情况下, 用 Razor Page 就不太合适了.
因为 same route 但是不同 View. 而 Razor Page 的特色是 1 个 View match 1 个 Route.
所以这里就可以用 MVC 的方式, Route match 了进入 Controller, 然后判断是 service 还是 category 然后输入 service view 或者 category view.
这个做法就比较直观了.