ASP.NET MVC6啟程(一)之 Hello World!

来源:http://www.cnblogs.com/suqier/archive/2016/04/22/start-mvc6-develop-hello-world.html
-Advertisement-
Play Games

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(...)之間到底是怎樣的關係,以及佈局頁的使用,和數據訪問我下次再說。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 要矩形裁切影像圖,首先得繪製一個裁切矩形,用這個矩形作為一個geometry來裁切 裁切界面如圖所示: 代碼如下: ...
  • 使用上兩者的介面都類似字典,並且SortedList的比如Find,FindIndex,RemoveAll常用方法都沒提供。 數據結構上二者差異比較大,SortedList查找數據極快,但添加新元素,刪除元素較慢,SortedDictionary查找,添加,刪除速度都比較平均。 博友的測試結果: 直 ...
  • Javascript在瀏覽器中的性能,可以說是前端開發者所要面對的最重要的可用性問題。 源碼:http://www.jinhusns.com/Products/Download/?type=xcj 在Yahoo的Yslow23條規則當中,其中一條是將JS放在底部 。原因是,事實上,大多數瀏覽器使用單 ...
  • 對稱加密的缺點是雙方使用相同的密鑰和IV進行加密、解密。由於接收方必須知道密鑰和IV才能解密數據,因此發送方需要先將密鑰和IV傳遞給接收方。這就 有一個問題,如果攻擊者截獲了密鑰和IV,也就等於知道瞭如何解密數據!如何保證發送方傳遞給接收方的密鑰和IV不被攻擊者截獲並破譯呢? 源碼:http://w ...
  • 具體的異常信息如下,一開始沒有寫日誌只看到錯誤信息:Count must have a non-negative value.,從錶面意思可以看出來是Count值出現了負數,所以報錯,查了半天的原因也沒有看出來為什麼,直到後面,我把Linq表達式輸了出來,發現Skip(-10),我一想分頁查詢會根據 ...
  • 1、什麼是棧? 棧是一個記憶體數組,是一個後進先出的數據結構; 幾種數據類型: 1、某些類型變數的值; 2、程式當前的執行環境; 3、傳遞給方法的參數; 幾個普遍特征: 1、數據只能從棧的頂端插入和刪除; 2、把數據放到棧頂成為入棧; 3、從棧頂刪除數據成為出棧; 2、什麼是堆? 堆是一塊記憶體區域,在 ...
  • 使用asp.net創建自己的模板引擎是相當簡單的事情,而我們所使用的僅僅需要正則和反射兩個工具就足夠了。 來看看下麵一個來自於真實項目的模板頁(者進行了適當的精簡,為方便閱讀): ? <!DOCTYPE html> <html> <head> <title>${SYS_NAME}</title> < ...
  • 、CHAR。CHAR存儲定長數據很方便,CHAR欄位上的索引效率級高,比如定義char(10),那麼不論你存儲的數據是否達到了10個位元組,都要占去10個位元組的空間,不足的自動用空格填充,所以在讀取的時候可能要多次用到trim()。 2、VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。如果一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...