2016年4月24日 星期日

入門學習 ASP.NET MVC 的建議

2009 年在台灣微軟 7F 的一場由 Will 保哥所帶來的一個多小時教學課程開始,我第一次接觸了 ASP.NET MVC,當時的我對於這項技術還是懵懵懂懂,整場下來猶如走馬看花一般,太多觀念與實作方式與當時我所熟悉的 ASP.NET WebForm 有著極大的不同,但當時對我而言,比較讓我不明白的是在 View, Controller 以及 Route,因為這是 WebForm 所沒有的,但已經使用 LINQ to SQL 與 Entity Framework, 物件導向程式開發的我來說,在 Model 部分是沒有讓我有任何的不明白,當時我已經不再使用 DataSet, DataTable, DataSource Controls,而在一年之後的七月,我就全面開始以 ASP.NET MVC 在工作上進行專案開發,而從 ASP.NET WebForm 到全面轉換為 ASP.NET MVC 開發,這過程我花了一個多月,不算順利、遇到很多問題、撞了很多牆、衝擊很多觀念,最後就一直到了現在。

這邊分享一些我的看法與建議。

 


在網路上看到很多人都提問,到底要怎麼入門學習 ASP.NET MVC 呢?

不諱言,與 ASP.NET WebForm 相比,ASP.NET MVC 的入門門檻是相當高,因為有很多觀念與技術是必須要先學會的,不像 WebForm 在一開始只需學會「拖、拉、放」「上網找範例」「上網找別人怎麼使用控制項的範例」就可以上手,而 ASP.NET MVC 的相關技術都必須要會,而且對於物件導向觀念又相當需要,以致於很多人都學不來,甚至於很多人自己以為自己會了,而工作上所做的、所開發出來的卻是讓人看了直搖頭。

要怎麼入門學習 ASP.NET MVC 呢?還真的是大哉問呀。

先來釐清一下幾個現在蠻多人會誤解的項目。

 

聽說下一代的 ASP.NET MVC 快要出來了,是不是現在還不用先學 ASP.NET MVC 5,等到時候下一代 ASP.NET MVC 出來之後再學就好了

不要被之前的技術更迭慣例給制約了,ASP.NET 相關技術這十多年來的更新與改版,給大家的感覺都好像是每一個改版就是添加新功能、修改舊錯誤、增加效能等等,但這一次的改版就真的別這麼想。

如果還記得的話,回想一下當時 ASP.NET MVC 剛出來的時候,一堆人還在擔心是不是要出來取代 WebForm,而之後時間一久,現在大家都可以明白這兩種是不一樣的技術,沒有誰取代誰的事情。

ASP.NET MVC 發展至今已經是第五個版本了,每個版本的發佈都有一定幅度的修改,而到了 ASP.NET MVC 4 與 5 的更新與之前幾個版本的更新就沒有那麼大了,但是 ASP.NET MVC 5 從 2014 年發佈至今已經有一大段時間沒有重大更新了,而這期間也一直不斷地有很多版本更新的消息,下一版的名稱卻是不斷的變換,從 ASP.NET MVC 6 到 ASP.NET 5 等等,到最後會是什麼名字,其實我也不知道,但可以確定的是,下一個新版本的 ASP.NET MVC 不是單純的 ASP.NET MVC 5 的更版,而會是一個全新的世界,如果硬要用一個比喻的話,雖然我這樣說不是很好,但可以從中感受變化的幅度,新一代的 ASP.NET MVC 與目前 ASP.NET MVC 5 的變化,就好比 ASP 與 ASP.NET WebForm 的不同。

大家不妨從去年 Will 保哥在 Tech Days 的課程去瞭解所謂的不同與差異。

ASP.NET 5 開發攻略 | TechDays Taiwan 2015 | Channel 9
https://channel9.msdn.com/Events/TechDays/TechDays-Taiwan-2015/DEV305

另外我建議大家訂閱以下的部落格,這是一位在微軟公司裡從事 ASP.NET 相關產品開發團隊成員的部落格,提供了第一手有關 ASP.NET Core 的相關資訊。「備註:事先聲明,在這裡所列出的資訊不代表官方消息,正式的產品消息還是要以 ASP.NET 產品經理的部落格或是產品網站為主 (www.asp.net)」

ASP.NET Core 資訊分享 - 點部落
https://dotblogs.com.tw/aspnetshare

 

學 ASP.NET MVC 的難度比較 ASP.NET WebForm 還要高,而且要學的東西還要更多,是不是要把以前在 ASP.NET WebForm 裡面所用的那一套給全部打掉重練

是的,難度的確高了不少,最早以前在 WebForm 的開發是有很多人不會看 HTML 原始碼、也不會 Javascript,但漸漸地這樣的狀況在這幾年就比較少看到不會 HTML 與 Javascript 的 ASP.NET WebForm 開發人員。

各位要想,ASP.NET WebForm 是眾多網站開發技術的其中一個,而且這一個的佔比並沒有很多喔,也就表示使用 ASP.NET WebFom 的開發是少數的,而其他的絕大多數是沒有所謂的網頁伺服器控制項,大多數的開發技術是要必須熟悉 HTML, CSS, Javascript 等前端技術,所以既然是開發網站,認識網頁前端技術是必要而必須的。

並不需要把以前在 ASP.NET WebForm 開發時的技術給全部丟掉,至少程式語言的使用與操作是一樣的,不需要重新來過,但有一點例外,那就是物件導向的觀念,很多 WebForm 開發人員並沒有物件導向程式設計的觀念,因為沒有這觀念也可以開發,甚至於以為建立物件類別,然後在程式裡傳來傳去就是有在用物件導向程式開發,以致於到了開發 ASP.NET MVC 時就出現落差與錯用觀念的現象。

 

其實有很多都是以前講過的,但就不在這邊又再一次老生常談,所以將之前我在論壇裡所提供的建議給重新做了整理,然後提供給各位做個參考。

 


2014-06-16 對於「入門應該學ASP.NET 還是直接上 ASP.NET MVC」問題的回應

http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20140616093419A84.html

Hello, 你好
你在內容說到只有對前端稍有概念與基礎,然後文中有提到你已經對 VB.NET 相當熟悉,我必須說,ASP.NET WebForm 與 ASP.NET MVC 的觀念與實作是南轅北轍,很多人會因為這兩種技術都有著「ASP.NET」的前綴字而有所誤解,並不是說已經學會或是熟悉 ASP.NET WebForm 之後就可以輕鬆的轉換使用 ASP.NET MVC,其實並不是這樣的喔(當然也有觀念清楚與深厚基礎的開發人員是可以在短時間從原有 WebForms 基礎就熟悉 MVC)。

很多開發多年並且熟悉 ASP.NET WebForms 的開發者總會認為不都是一樣 .NET 技術,而且也屬於 ASP.NET 的技術範疇,所以「直覺」會認為學習 MVC 不是一件需要太多時間去準備或是學習的事情,很多 WebForms 開發者就會選擇上網自學或是買書自學,有一半的開發人員可以藉由這樣的方式去學好 ASP.NET MVC,但是有很大一部份的人都會撞牆,而且會遇到很大的阻礙,然後就會覺得 ASP.NET MVC 很難,不好學,甚至於厭惡,其中一個很大的觀念差異就在於「物件導向」。

不是使用了 .NET 的程式語言就表示你是在使用「物件導向」來開發,物件導向並不是原本在讀書時躺在課本裡的名詞,也不是只有考試才會出現的內容,無論是使用 C#, VB.NET 還是開發 WebForms 或 MVC,物件導向是隨時隨地都在的,但是往往很多 ASP.NET WebForms 開發者並不是使用「物件導向」的觀念與方式來開發,所以在轉而學習 MVC 的時候就會有很大的觀念落差。

我一開始學習並開發 ASP.NET WebForms 的時候也是一樣,並不清楚什麼是物件導向,
頁面一樣是控制項拖拉放的方式來完成,Code-Behind 的程式也只是可以 Work 就好,
但是這樣的程式開發真的很累,也很難維護,到最後都是 Google Search, Copy, Paste, Try,  Debug.... 一直循環。

直到後來有人指導怎麼使用物件導向的觀念與方式來開發之後,就漸漸了解什麼是開發,
在進而了解網頁生命週期是怎麼一回事,逐漸地不再是一昧的使用 Server Controls,而是會使用不一樣的方式來開發,因為有了這些的學習與經驗之後,讓我轉而學習並使用 ASP.NET MVC 開發就不會有很大的落差與隔閡,而且很快的就上手。

學習 ASP.NET MVC 並不是看幾篇文章或是買本書來看完之後就可以說「我已經會 ASP.NET MVC」,我之前參與的一個專案就是使用 ASP.NET MVC 來開發,參與開發的程式設計師資歷與經驗都不同,其中有一個成員就是會寫程式、學習 ASP.NET MVC 是買書自學的,但是他的觀念並不是很好,是屬於「能跑、能執行」觀念的人,物件導向對他來說只是需要建立很多的物件來用而已,很多技術的使用都是 Google Search, Copy, Paste, Try,  Debug 的方式,所以很多程式寫法都是東拼西湊,然後不在乎共同開發時的維護與整合問題,因為自始至終都是抱持著「能跑、能執行就好」,但是這樣的產出並不好維護,而且問題層出不窮,錯誤連環爆。

要學好 ASP.NET MVC 的確是要比 ASP.NET WebForms 更需要知道很多東西,但這些都不是問題,只要觀念清楚,不管是使用 WebForms 還是 MVC 開發,不都是一樣使用 C# VB.NET 這些 .NET Framework 技術,有些人對於 WebForms 與 MVC 會有很多爭論,其實「不是南北拳的問題,是觀念的問題!」。

兩種技術都有不同的使用情境與適合的地方,技術學了就是要使用,如果公司主要的開發會是使用 ASP.NET WebForms 的話,那當然就是好好地把工作所需要使用的技術給學好,有時間再關注 MVC,如果沒有任何包袱的話,就真的好好地從基礎學起,練好馬步,一招一式地去學好 ASP.NET MVC。

學習沒有任何捷徑,一個步驟一個步驟慢慢來,欲速則不達。
前面有說到跟我一起參與專案開發的那位開發者,他就是沒有把基礎學好,東拼西湊不說,
很多做法就是使用怪招怪式,看起來是可以解決問題,但往往形成更大的問題,在整個開發過程中,他的開發速度真的很快,很多指派給他的工作,往往都用很快的時間完成,但是…
之後一直出問題、反覆修改、重作的也都是他所負責的部份。

觀念問題,這是很多前輩一直都在耳提面命的。
欲速則不達,真的,基礎一定要學好來(尤其是 ASP.NET MVC,物件導向、前端技術等),不管是 WebForms 還是 MVC 都是需要抱持一樣的學習態度。

 


2014-07-06 對於「MVC 架構與C#」問題的回應

http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD2014070417531154I.html

Hello, 你好
SkillTree 的 ASP.NET MVC 5 課程,請密切注意 SkillTree 的臉書專頁或是官網,隨時關注 SkillTree 的訊息。
「我一開始學習並開發 ASP.NET WebForms 的時候也是一樣,並不清楚什麼是物件導向,
頁面一樣是控制項拖拉放的方式來完成,Code-behind 的程式也只是可以 Work 就好」
這是我還在初接觸開發 ASP.NET WebForm 時候的狀況,不過當時公司有一位資深同事的一句話就點醒了我,他說「你這樣寫程式,功能都有做出來,但是卻相當不好維護,以後接你程式的人會很痛苦」。

雖然那時候是 ASP.NET WebForm 菜鳥,但是之前已經有寫 ASP PHP 幾年的經驗,對於自己的程式品質還有點自負,所以當被這樣說的時候,信心是有被打擊到,也讓我反思,什麼樣的程式設計才是好維護的呢?

還有「你的程式寫法根本就是亂七八糟,根本沒有所謂的物件導向.....」,前面我有說過,當時是 ASP.NET WebForm 菜鳥,但是之前已經有寫 ASP PHP 幾年的經驗,我那時候天真的以為用了 C# 所寫出來的程式,然後有去建立類別、使用物件的一些作法就是所謂的物件導向,
於是我又開始思考什麼是物件導向的程式設計。

到後來,我逐漸地不去使用 DataSource Control,資料的存取都是直接使用 ADO.NET 的作法,漸漸地不再總是使用 DataSet DataTable,然後試著用物件導向的程式設計方式來寫程式,不再只是一昧的到 Google 去搜尋能用的 code,嘗試去看別人寫的專案(有很多 Open Source),也因為前面的這些改變與嘗試,所以當我轉為使用 ASP.NET MVC 的開發時,期間一定會有轉換陣痛期,但只是觀念與作法的適應與修正,這一段轉換陣痛期的時間還好不長,
就開發一個小型專案,大約一個月的時間,我就完全適應 ASP.NET MVC 的開發方式。

對了,ASP.NET MVC 因為沒有 Server Controls,所以有關前端的基礎是一定要具備的 HTML, Javascript, CSS,其中 HTML Javascript 一定要會寫會用,CSS 要會看。建議你,先在工作上會使用的 ASP.NET WebForm 給學好,工作上也會接手到 MVC 的專案,先去了解 MVC 網站的架構與開發方式,畢竟開發 MVC 會需要一定的基礎(當然我也看很多那種直接拿來就做的 MVC 網站,沒有章法的作法,看了只是讓我頭疼)。

ASP.NET MVC 官網的教學課程,跟著做,
ASP.NET MVC 4 的基礎入門課程
http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4
ASP.NET MVC 5 的基礎入門課程
http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started
ASP.NET MVC 學習資源整理 Part.1
http://kevintsengtw.blogspot.tw/2012/04/aspnet-mvc-part1.html#.U7giW_mSwlQ

ASP.NET MVC 學習資源整理 Part.2 - 國外部落格
http://kevintsengtw.blogspot.tw/2012/09/aspnet-mvc-part2.html#.U7giXvmSwlQ

ASP.NET MVC 學習資源整理 Part.3 - 書籍 (Books)
http://kevintsengtw.blogspot.tw/2013/03/aspnet-mvc-part3-books.html#.U7giZfmSwlQ

就你目前的情況,就先練好馬步!

 


相關連結

https://skilltree.my/

http://mvc.tw/

ASP.NET Core 資訊分享 - 點部落
https://dotblogs.com.tw/aspnetshare

ASP.NET 5 開發攻略 | TechDays Taiwan 2015 | Channel 9
https://channel9.msdn.com/Events/TechDays/TechDays-Taiwan-2015/DEV305

 

延伸閱讀

ASP.NET MVC 學習資源整理 Part.1 (官方學習資源)
ASP.NET MVC 學習資源整理 Part.2 - 國外部落格
ASP.NET MVC 學習資源整理 Part.3 - 書籍 (Books)
ASP.NET MVC 學習資源整理 Part.4 - ASP.NET MVC 5 書籍 (Books)

mrkt 的程式學習筆記: 你要 Coding 多久呢?

mrkt 的程式學習筆記: ASP.NET MVC

mrkt 的程式學習筆記: 範例程式 @ GitHub

 

以上

8 則留言:

  1. 真要說的話
    兩者的差就像是戰士和魔法師一樣
    不同體系要怎麼無痛轉職XD

    雖然很多人說MVC入門門檻很高
    不過我覺得它只是把webform以往掩蓋的細節給暴露出來
    該學的東西還是要學的
    webform好在簡易網站開發上好上手而已

    回覆刪除
    回覆
    1. 對於有玩遊戲的人來說,你的比較蠻恰當的
      (但是我平常除了玩玩 candy crush 外,其他遊戲都沒在玩)
      另外你說到「把webform以往掩蓋的細節給暴露出來,該學的東西還是要學的」
      說得真是對極了

      刪除
  2. 初學ASP.NET MVC,非常感謝提供這麼多學習的方向。

    回覆刪除
  3. 您好,我想請教一個問題

    最近公司準備改用.NET MVC開發新的案子,內部教育訓練時有介紹系統的底層和一些模組
    我聽完後突然有種違和感,這和我在MVC5 網站開發美學這本書上看到的東西有些出入

    聽講師的介紹,我們公司的模組都以事件來呼叫controller,完全沒用到router
    而資料是在controller組合SQL去下query,再把資料塞回前台
    他們說我們用的是MVC,不過是變形版,controller變成web api

    請問這樣還算是ASP.NET MVC的架構嗎? 還是只是用MVC去開發webfrom的網站而已?

    回覆刪除
    回覆
    1. Hello, 看了你的提問內容,我實在是完全搞不懂,為何 ASP.NET MVC 會與 WebForm 的開發扯上關係呢?

      我不曉得你是請那位講師到你們公司做訓練,也不曉得你們原本的專案是如何開發的?
      然後什麼「MVC ... 變形版,controller變成web api」搞得我好亂

      ASP.NET MVC 就是 ASP.NET MVC,沒有所謂的「用MVC去開發webfrom的網站」
      我的判斷是... 你們所開發的 MVC 專案是把所有的處理都完全擠在 Controller 的 Action 方法裡,
      不管是商業邏輯處理或是資料存取處理,一堆的程式處理都是在 Controller Action 裡面

      再來就是那個 WebApi 的部分,大概你們也是第一次接觸 MVC,也對 WebApi 不清楚或是不知道
      以前 WebForm 傳回 JSON 內容的做法就是用 ashx 或是直接傳回純文字
      所以在 MVC 專案裡就是直接在 Action 方法裡回傳 JSON 內容
      其實直接用 MVC 專案做這種處理也沒有什麼不好,
      只是另外有種專案是 ASP.NET Web API 可支援實作更完整的 RESTful API 服務
      如果你們的專案是不包含網頁呈現的部分而只有單純做 API 的服務而回傳 JSON 的內容
      可以考慮使用 ASP.NET Web API 專案

      總的來說,你們對於 ASP.NET WebFom 與 ASP.NET MVC 或 ASP.NET Web API 並不清楚差異
      所以最好再去找人問清楚,而不是用網路的一問一答的方式,不妨週四晚上來 twMVC 聚會,與我們一對一的討論
      https://mvc.tw/coding4fun

      回到那個「在controller組合SQL去下query,再把資料塞回前台」的做法
      大概你們之前的開發方式就是在 WebForm 的 Code-Behind 的程式裡都是直接在每個事件方法裡去做這樣處理
      所以到了使用 MVC 開發專案就沿用了相同的模式來寫程式
      有沒有想過將不同的邏輯處理分開來呢?
      例如資料存取的程式就獨立開來,而商業邏輯的程式也分出去,
      而 controller 的 action 方法就是做呼叫這些程式來做事,做完後再回傳結果
      讓各種做不同事情的程式給獨立開來,各自處理不同職責的事情,
      讓原本混雜的程式切分回數個程式,這些獨立的程式就可以很單純,
      因為單純而且只負責各自的邏輯,所以就會很容易開發與維護,
      職責單一、關注點分離,不就是這樣嗎?

      還是來一趟 twMVC 聚會,直接面對面的討論

      刪除
  4. 最近用了一陣子的MVC
    我覺得都差不多看怎麼呈現資料而已
    而且現在前後端分離越來越多的情況下
    如果只是拿來當api不管mvc也好或是webform也好 價值都差不多

    最近.net5發布
    不知道大大有沒有想要踩blazor的坑 XD

    回覆刪除
  5. 如果對軟體積木有興趣, 可以參考一下, 謝謝:
    「用 ASP.NET Core 打造軟體積木和應用系統」
    https://www.tenlong.com.tw/products/9789865029883?list_name=lv

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。