原本的意思是想把之前的先後臺緊密聯繫的WebForm機制改變成靈活的配置方式,可是微軟以爲每一個控制器訪問的 Model 和視圖 若是都是用配置文件的方式的話,很麻煩。html
因此微軟採起了一種「約定大於配置」的理念:程序員
用戶訪問某個 控制器 裏 Action方法,就會去自動加載 同名的 視圖。設計模式
缺點:不能在運行時經過配置靈活的 修改 模型和視圖的組合關係;瀏覽器
優勢:mvc
大量的減小了程序員的配置工做;框架
自己網站的業務和頁面就是配套的,不多有共用或改變的狀況;網站
能夠 容許 程序員使用 不一樣的 視圖引擎,從而根據不一樣的業務和習慣選擇不一樣的視圖引擎提升開發效率。url
是一種用於將 具體顯示 與 業務 分離,並可以經過某種方式靈活改變的代碼設計方式。spa
優勢在於,用戶請求的 頁面 和 業務 能夠靈活配置,下降了 頁面呈現 和 後臺業務的耦合度。.net
簡而言之:用戶請求控制器,控制器【根據配置】決定調用哪一個模型來執行業務,並將返回的數據裝入 哪一個 視圖,最後生成html代碼返回給用戶。
1.3視圖加載規則,經過mvc找不到視圖的錯誤,瞭解加載規則:
a.先去與控制器同名的 視圖文件夾
2.1 Controller 接收瀏覽器數據
a.獲取Get數據 :
a1:獲取路由url中配置好的制定參數:
如 配置好的路由:
瀏覽器請求路徑爲: /User/Modify/1 .
MVC框架 獲取請求後,就會找到匹配的路由映射路徑url,得知 是請求的 控制器類 User裏的 Modify 方法,此時就會檢查此方法是否包含一個 名爲 id 的參數,若是有,按照配置的url 獲取「參數」{id},並傳給此方法。
a2.直接經過請求上下文對象裏的 Request獲取 url ?後的的參數:
瀏覽器請求路徑爲:/User/UserList/1?fun=jp
控制器獲取:Request.QueryString["fun"];
b.獲取Post數據
b1.經過 Request.Form["name"] 逐個獲取 表單提交的數據
b2.經過 FormCollection form逐個獲取 表單提交的數據
b3.經過 實體對象 一次性獲取 表單元素的數據,並設置到 實體對象對應的屬性中
表單中的表單元素的 屬性名稱 必須和 實體對象 的屬性同樣!
查看源碼時,方法都沒有Region,因此都處於打開狀態,能夠使用快捷鍵
摺疊類中全部方法:ctrl+m+o
摺疊類中全部的代碼塊,包括類:ctrl+m+l
ViewData/ViewBag/TempData/Model
其中:ViewData和ViewBag本質上都是【ViewDataDictionary】類型,而且二者之間的數據共享,只不過提供了不一樣的語法操做方式而已。
在視圖代碼中使用 ViewData
在視圖代碼中使用ViewBag
注意:與ViewData同樣,都須要在使用以前轉型!
在視圖代碼中使用TempData:
查看源碼:
發現,只要從TempData中取出一個元素,就會當即將此元素移除!
在控制器裏的Action方法最後 調用View加載視圖的時候,將 數據對象傳入。
視圖中,能夠經過 Model屬性獲取!而且不須要轉型就能夠直接使用!
注意:Model雖然能夠不轉型就直接使用,可是 由於編譯器沒法在編譯時獲取它的類型,因此就沒法出現智能提示!
爲了解決這個問題,咱們能夠在試圖的最上面經過代碼指定model類型
使用時能夠「點」出來
查看源碼:
當咱們在試圖上添加了 @model指令時
當前視圖就會繼承於 WebViewPage<T> 強類型視圖頁面類,而且指定T爲Student:
若是沒有添加@model指令:
當前視圖就會繼承於 WebViewPage<T> 強類型視圖頁面類,但T變成了 dynamic
4.1 其實咱們的cshtml視圖頁面,在被訪問的時候,也編譯成了頁面類,
繼承於:WebViewPage<T>
4.2 cshtml頁面裏的全部的代碼,都編譯到 這個類的Excute方法裏了
5.1 Razor自動轉義< > 尖括號
在Action方法中編寫以下代碼:
在cshtml中輸出的結果以下:
5.2使用HtmlString來封裝字符串,就不會被Razor轉義
結果:
5.3使用System.Web.IHtmlString: @Html.Raw("<p>a</p>")
5.4在js代碼中防止轉義
5.5代碼塊
@{ //1.執行多行C#代碼 string s ="Hi~"; int age =11; }
@{ //2.調用無返回值方法 Html.RenderPartial("SomePartial"); }
5.6調用泛型方法,須要特殊語法:加上一對小括號:
@(Html.SayHi<string>())
5.7在C#代碼塊中直接輸出 字符串文本
@for (int i = 0; i < 5; i++) { //<text>哈哈哈</text> @:哈哈哈 }