ASP.NET MVC6已出爐多時,但現在很多項目都還在使用MVC4,所以MVC6還尚未流行開來,但是從各大新聞報紙媒體上都能或多或少的知道它的跨平臺特性,這也就彌補的ASP.NET一直以來的缺憾,所以我也開始加入研究MVC6的陣營中來,這一研究忽然發現有很多似曾相識的地方,又有很多令人拍案叫好的地 ...
ASP.NET MVC6已出爐多時,但現在很多項目都還在使用MVC4,所以MVC6還尚未流行開來,但是從各大新聞報紙媒體上都能或多或少的知道它的跨平臺特性,這也就彌補的ASP.NET一直以來的缺憾,所以我也開始加入研究MVC6的陣營中來,這一研究忽然發現有很多似曾相識的地方,又有很多令人拍案叫好的地方。下麵我就從我剛開始接觸MVC6時所遇到的問題入手,記錄一下MVC6的一些基礎應用。
1、打開VS2015創建ASP.NET Web Application項目。
圖1然後選擇“ASP.NET 5 Template”下的“Empty”模板。為什麼不選右邊的“Web Application”?原因很簡單,學一樣新東西得從無到有開始學,如果一開始就被IDE矇蔽的雙眼,後面還如何前進?
圖2項目創建完成之後,我們會看到如下打開的文件:
圖3我們先不管它們是什麼意思,先運行一下看看是個什麼效果:
圖4結果就是這個樣子,那麼這個“Hello World!”是在哪個地方定義的呢,很明顯它是在圖3的第27行定義的,只要我們把那個地方的字元串改掉,頁面就會輸出不同的內容。也就是說“Configure”方法會在我們程式啟動的時候被調用,那麼又是誰調用的它?圖3的第32行就是我們想找的Main方法,它就是程式的入口,至於它內部的實現機制,就得深入源碼去研究了,為了不至於一開始就產生挫敗感,研究源碼的事放後面再說,先實現一個簡單的小應用,找點成就感。這裡我們只需要知道它是用來啟動我們的Web應用的就行了。
接下來我們來看看MVC6項目結構(左側),我這裡拿它跟MVC4的結構(右側)對比一下:
圖5 | 圖6 |
我驚奇的發現,MVC6的項目似乎沒有文件夾了,那麼真的是這樣麽?其實我們可以點開“wwwroot”這個節點,裡面就出現了我們熟悉的“web.config”文件,也就是說“wwwroot”就是網站的根目錄,我們的一些靜態資源文件(css、js、image等)都應該放在這個目錄下。那麼我們的“Controllers”文件夾和“Views”文件夾去哪兒了呢?沒有嘛,那就自己建一個唄,這還不簡單?於是我們就先建這兩個文件夾放著:
圖7註意:這倆文件夾應該建在項目的最外層,而不應該建在“wwwroot”文件夾下麵。也就是說這倆文件夾應該跟“wwwroot”處於同一級。
然後,我們就在“controllers”文件夾上右鍵,然後“Add”-“New Item”,在彈出的對話框中先選擇左側導航的“Server-side”表示選擇“伺服器端”的項,然後從右側出現的列表中選擇“MVC Controller Class”,然後輸入controller的名字添加。
圖8添加完成之後,VS會自動打開剛創建的controller文件,結果是這樣的:
圖9啊!為什麼會出現紅色波浪線!因為“Controller”類並沒有被解析出來,換句話說,我們還沒引用MVC的包。引用MVC的包有兩種方式,看個人喜好用哪種:
第一種:通過項目根目錄下的“project.json”文件添加。打開該文件,我們會看到json格式的數據,我們找到“dependencies”節點,這裡面定義的就是項目依賴的包。我們在裡面做如下新增:
圖10 圖11所以,添加完之後,應該是下麵這個樣子:
"dependencies": {
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final"
}
第二種:通過包管理器。首先,在項目的“References”節點上右鍵,點擊“Manage NuGet Packages...”,然後在右側打開的選項卡的頂部選擇“Browse”,然後在上面的搜索框中輸入“mvc”,然後會發現很多列表,然後我們單擊選擇“Microsoft.AspNet.Mvc”這個項,與此同時右側屬性視窗會顯示出可用的版本,當我們選擇版本之後,點擊右邊的“Install”按鈕安裝即可。
圖20安裝完之後,我們再來看看controller文件有沒有被解析到:
圖12我們發現已經被很好的解析了,接下來我們像MVC4中創建視圖一樣,創建一個視圖。如下:
圖13然後我們迫不及待的想跑一下,結果得到的是這個結果:
圖14為啥還是“Hello World!”,我的“OK”呢?有人可能覺得是我沒把地址打完整,好,我打完整看看:
圖15結果還是這個,這是為什麼呢?我們看下麵這段代碼:
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
我們這幾次的輸出都是由它在進行,那麼它是什麼?複雜的我先不說,現在我們就可以把它理解成一個實現“IHttpAsyncHandler”介面的實例,裡面那個委托就是“ProcessRequest(HttpContext context)”方法,這下是不是稍微有些明白了?那麼“app.Run(...)”又是做什麼的呢?我們可以簡單通過智能提示瞭解一下:
圖16智能提示說,這個方法,添加一個終端中間件處理委托到應用程式的請求管道裡面。這是啥意思呢?我們可以用下麵這個圖來簡單說明一下:
圖17所以如果不在IIS跟終端中間件之間攔截一下的話,輸出始終都會是“Hello World!”。那麼,我們該如何攔截呢?
我們可以在它之前再添加一個終端中間件:
app.Run(async context =>
{
await Task.Run(() => { });
});
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
這樣一來,就啥也不會輸出了。但是,這樣做毫無意義,我們該如何把MVC的中間件添加上去呢?很簡單,我們只需在前面添加如下代碼,就能把MVC中間件給加上了。裡面的路由參數我就不多說了,用過MVC4的應該都知道。
app.UseMvc(route =>
{
route.MapRoute(
name: "default",
template: "{controller}/{action}",
defaults: new { controller = "home", action = "index" }
);
});
接下來,我們再跑一下看看是不是成功了:
圖18報錯了,說找不到服務,要通過IServiceCollection.AddMvc()添加服務,於是我們在Startup.cs文件裡面找找,結果確實有個配置IServiceCollection的地方,然後我們把MVC服務添加進去,如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
好,然後Rebuild刷新頁面:
圖19結果發現OK了。有沒有小小的激動一把,至於services.AddMvc()和app.UseMvc(...)之間到底是怎樣的關係,以及佈局頁的使用,和數據訪問我下次再說。