更新 : 2019-06-15
目前 razor page 在做 multiple form in one page 的時候有個大局限
就是無法使用多個 BindProperty
一旦多個,那么任何一個 form 提交都會把所有 model 進行 valid
那就壞掉了
refer :
沒有去找 github issue 以后才看看吧。
目前的做法就不要使用 BindProperty, 代價就是前端無法用 c# binding form.
更新 2019-04-27
最近做了更多的 research 發現微軟視乎有意發展 razor page.
razor page 的定位是 mvvm, 現在還有個叫 blazor 的東西, 類似用 c# + razor = react 的概念
從前就覺得 react 的 jsx 和 razor 差不多嘛.. 估計微軟會往哪里走.
好處應該挺多的,畢竟就目前的技術來看,如果要搞個體驗好的電商項目,沒有用前端框架是不行的.
如果后端框架可以支持更多交互體驗,把實現都封裝起來, 一定有些項目是非常適合的.
所以現在開始認真學 razor page 咯.
razor page 其實沒有什么特別神奇的功能, 只是調用起來不一樣而已.
首先, 它是用來處理 page 的, 就是那種返回 html 的 page.
wei api 不算, 返回 file 也不在它的管轄內.
1. router
mvc <a asp-controller asp-action>
razor page <a asp-page asp-handler > , asp-page="Folder/File" 它是按路徑的
2. action binding
mvc [FromBody] [FromQuery]
razor page 用的是 [BindProperty] , string value 匹配的是 query string
public class InputModel { public string code { get; set; } } [BindProperty] public InputModel data { get; set; } public void OnPost(string value) { } public void OnPostEdit(string value) { }
refer :
https://www.twilio.com/blog/introduction-asp-net-core-razor-pages
https://www.mikesdotnetting.com/article/327/customising-routing-conventions-in-razor-pages
razor page vs MVC
通常我們都是拿這 2 者做比較.
mvc 的做法是
route 匹配 controller action (一個 controller action 可以對多個 route template)
由 action 方法的 parameter 接受 inputModel 然后返回 view model
razor page 的做法是
route 匹配一個文件 cshtml 文件. (一個文件也可以對多個 route template, 要在 startup 弄)
這個文件有一個 .cs 對應, 你可以把它看成 controller
它不用 parameter 來接受 inputModel 而是用自身屬性 + attribute [BindProperty] 來表示.
然后它本身的屬性就是 viewmodel 了.
多個 action 的做法是通過 onPostAbcHandler onPostxyzHandler 來實現的.
玩玩了一下,覺得也沒有特別高明之處. 尤其我的需求是要語言,需要一個文件對應多個 route template,這點並不給力.
比較厲害的地方應該只有一個,就是 folder 結構可以喜歡怎樣開就怎樣開吧. 這點我覺得比 mvc + ViewLocationExpanders 還要好一點點啦.