ASP.NET Core – MVC

前言

在 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.

这个做法就比较直观了.

 

posted @ 2022-08-23 00:51  兴杰  阅读(230)  评论(0)    收藏  举报