MVC知識點整理匯總

MVC與ASP.NET MVC基礎概念

MVC是Model-View-Controller的縮寫.

MVC將應用程序劃分為3大組件:模型\視圖\控制器.

MVC不是ASP.NET所特有,它只是一種開發理念.java中的struts2也是一種MVC模型.

ASP.NET?MVC從2008年發布1.0版以來,截至2014年ASP.NET?MVC最新版本已經是5.0.

ASP.NET?MVC從1.0版開始,就已經開放源代碼(源碼地址:aspnetwebstack.codeplex.com).

ASP.NET?MVC官網地址:http://www.asp.net/mvc

MVC三大組件的相互關系

在控制器中可以直接調用視圖和模型

在視圖中可以調用模型.

模型不能調用視圖

模型能夠限定視圖中使用的數據,但視圖中使用的模型應由控制器提供

在視圖中可以調用控制器(通過視圖中表單的提交和點擊超鏈接的方式調用)

ASP.NET?Webform模型和ASP.NET?MVC模型的關系

二者都是基于ASP.NET?Web框架構建的開發模型.所以ASP.NET中的一些功能可以被二者公用.

Webform編程模型是典型的以事件驅動的web模型,而MVC則不是.

Webform的URL地址是基于文件系統的,而MVC則是基于Action.

ASP.NET?MVC中的約定

所有的控制器必須放到Controllers文件夾下

所有的控制器類名必須以Controller結尾

所有的模型應該放到Models目錄下

所有的視圖文件都應該放到Views目錄下.

所有的控制器類都應該繼承自Controller類(本質上是要繼承Icontroller接口)

在控制器類中的public方法被成為Action(行為)

如果在相應的視圖目錄中沒有找到視圖文件,那么會尋找Views\Shared目錄下名稱相同的視圖文件

在Action中return?view(),默認會返回和Action名稱一樣的視圖文件.

在Global.asax全局應用程序類中注冊了默認路由(名稱為Default),默認路由指定了Controller默認為Home,Action默認為Index,參數id為可選參數.所以在URL地址中如果不輸入controller默認訪問Home控制器;如果不輸入action默認訪問名稱為Index的action.

http://localhost:54321/解釋:

根據默認路由規則,等價于=>?http://localhost:54321/Home/Index

http://localhost:54321/Home/Index/5解釋:

數值5會自動映射到action中名稱為id的參數中。

Http://localhost:54321/Home/Index/5?name=jack&age=20解釋:

其中參數包括id、name和age三個

其他

在視圖文件中,有一個名稱為Model屬性,它指代的是從Action中傳遞的模型數據.為了使用模型數據,我們還需要在<%@Page??%>指令的Inherits屬性中設置模型數據的類型.

ASP.NET?MVC進階一

控制器相關

在Controller類中方法訪問級別為public的方法,就是行為(Action).

如果不希望Controller類中的方法成為Action(可以在地址欄中被訪問),有兩種實現方式:

將方法的訪問級別設置為private

在方法上添加特性標記[NonAction]

諸如新增\修改等功能模塊,我們往往會創建2個名稱相同的Action:一個action用于加載新增\修改頁面;另一個action用于處理新增\修改頁面提交的表單數據.那么如何區分在何時調用哪個action呢?

我們將加載新增|修改頁面時被調用的action,添加[HttpGet]特性標記;將處理頁面提交的表單數據時調用的action,添加[HttpPost]特性標記.下面的示例代碼演示了如何實現學生的新增(action相關的代碼)

如何在Action中獲取表單提交的數據?

表單中提交的數據,可以通過Action的參數進行映射.

映射的前提條件:Html標記的name屬性值和action中參數的名稱要一致.

下面的示例代碼演示了映射的過程(注意粉色框標記的部分):

Action中如何映射復雜對象?

對于上面的映射代碼,我們還可以有另外一種等價的寫法,就是將映射的屬性定義到一個實體類中,這樣我們就可以在action中添加該實體類型的參數,參考代碼如下所示:

如何從一個Action中跳轉至另外一個Action?

新增或修改功能完成后,需要跳轉至數據列表頁面,我們可以通過如下代碼實現:

代碼=>?returnRedirectToAction(“ActionName”,?“ControllerName”).

視圖相關

在ASPX視圖引擎中,可以使用asp服務器控件,但它的作用僅僅局限與生成html代碼,而不推薦開發人員使用asp控件的事件.因此建議開發人員手工編寫Html標記。

但是手寫Html標記比較耗費時間,有沒有更好的解決方案?答案就是使用Html輔助方法。

Html輔助方法

Html輔助方法的作用就是通過調用C#方法的方式,快速的生成相應的html標記.

Html輔助方法分為2大類:弱類型html輔助方法和強類型html輔助方法.

其中以For關鍵字結尾的都是強類型的輔助方法.下面的示例代碼演示了二者的調用方式,以及生成的html源碼。

注意:Html輔助方法有很多種重載形式,在開發過程中可以根據實際需要自行選擇.比如要實現一個包含class\style\onchange屬性和事件的單行文本框,可以參考如下代碼:

強調:如何使用HTML輔助方法生成form標記?

生成form標記的兩個Html輔助方法為:Html.BeginForm()和Html.EndForm(),但他們在使用時和其他的Html輔助方法有所不同,下面的示例代碼演示了它們的兩種用法:

如何在URL地址中傳遞參數?

場景一:將學生ID值映射到名稱為id參數上

場景二:將學生ID值映射到名稱為stuId參數上

場景三:url地址中包括stuId和name兩個參數

這三種場景的使用代碼如下所示:

其他

在實際開發過程中,一個小的功能模塊就對應一個控制器.比如學生信息管理就是一個控制器,新增學生\修改學生\查詢學生列表\刪除學生都可以對應控制器中的Action.

常用Html輔助方法匯總

弱類型

強類型

單行文本框

Html.TextBox()

Html.TextBoxFor()

多行文本框

Html.TextArea()

Html.TextAreaFor()

密碼框

Html.Password()

Html.PasswordFor()

復選框

Html.Checkbox()

Html.CheckBoxFor()

單選按鈕

Html.RadioButton()

Html.RadioButtonFor()

下拉列表框

Html.DropdownList()

Html.DropdownListFor()

平鋪列表框

Html.ListBox()

Html.ListBoxFor()

Label

Html.Label()

Html.LabelFor()

Form表單

Html.BeginForm()?????Html.EndForm()

超鏈接

Html.ActionLink()

如何在視圖中使用下拉列表

第一步:在action中構造好下拉列表中需要的數據,數據的類型為IEnumerable。

第二步:將構造好的數據放到Controller中的ViewData(ViewBag|TempData)屬性中。

第三步:在視圖view中使用Html.DropDownList輔助方法來生成下拉列表,而綁定的數據可以使用視圖View中的ViewData來獲取(換句話講就是,Controller中放置到ViewData的數據,可以在視圖View中的ViewData屬性中提取)。

在視圖中使用Html.DropDownList綁定Ienumerable

ASP.NET?MVC進階二

數據驗證

數據驗證的步驟

在模型類中添加與驗證相關的特性標記

在客戶端導入與驗證相關的js文件和css文件

使用與驗證相關的Html輔助方法

在服務器端判斷是否通過服務器端驗證

常用的驗證標記

Required:非空驗證

StringLength:驗證字符串的長度

RegularExpression:正則表達式驗證

Compare:比較兩個字段的值是否相等

Range:范圍驗證

Remote:服務器驗證(需要在controller中編寫返回值為JsonResult的Action)

自定義驗證標記

與驗證相關的js文件

在ASP.NET?MVC中提供了2套驗證框架,分別是微軟驗證框架和jquery驗證框架.默認啟用了jquery驗證框架.

注意:這些js文件的順序不能顛倒;其中Site.css文件中定義了數據驗證使用的樣式.

驗證相關的Html輔助方法

注意:1.必須使用Html.ValidationMessage()和Html.ValidationMessageFor()來顯示驗證失效的提示信息;

2.被驗證的控件(如文本框\下拉列表框等)必須使用Html輔助方法生成才有效.

在服務器端判斷模型是否通過了驗證(服務器端驗證)

頁面中如果使用了MVC驗證功能,那么在后臺對應的Action中必須通過ModelState.IsValid判斷是否通過了服務器端驗證。只有通過了服務器端驗證,才能執行其他的業務邏輯代碼。

使用要點:

被驗證的標記不能是純html,必須使用相應的html輔助方法

例如:Html.TextBoxFor(model=>model.UserName),則驗證有效;

,則驗證無效;

必須使用相應的html輔助方法顯示驗證消息(Html.ValidationMessage)

被驗證的控件必須放在有html.beginform的輔助方法內部(不能是純標記).

客戶端驗證是不安全的,容易被禁用或欺騙,所以一定要在服務器端判斷ModelState.IsValid是否為true.

Action與View的數據傳遞

在某些情況下,視圖需要顯示多份數據(比如被修改的員工信息\崗位列表\部門列表),但是Action在返回視圖時,View()方法只能傳遞1個object類型的數據,那么其他的數據該如何傳遞?

ASP.NET?MVC為我們提供了3種方案:ViewData\TempData\ViewBag.

重要提示:在Controller和View中都有這三個屬性,在Controller的相應屬性中存放了數據后,就可以在View的相應屬性中提取這些數據。

ViewData

ViewData是一個字典類型.向里面添加數據時要以鍵值對的形式添加.

首先在Action中向ViewData中添加,其次就可以在View中訪問ViewData來提取數據.

ViewBag

ViewBag是一個動態類型的屬性。在ASP.NET?MVC?3.0中才加入了ViewBag屬性.

動態類型:dynamic,就是可以事先不為其定義屬性,通過直接給屬性賦值的方式就可以隨時為它添加新的屬性.

下面的代碼演示了向ViewBag中存放cls和stu兩個對象,這兩個對象分別放到了屬性ClassInfo和StudentInfo中。

TempData

TempData的用法和ViewData很相似,都是字典類型.那他們的區別是什么?

ViewData中存儲的數據僅僅對本次訪問的當前action有效.而TempData中存儲的數據,除了對本次訪問的當前action有效外,還對本次訪問的其他action有效(比如在Action1中向TempData中存放了數據,即使從Action1跳轉至Action2后,仍然可以在Action2中從TempData提取數據。而ViewData和ViewBag都無法做到這一點).因此,TempData中數據的生命周期比ViewData|ViewBag中的生命周期要長.

ActionResult的實現類

在ASP.NET?MVC模型中,Action用于響應用戶的各種請求,比如向客戶端返回html文檔、html片段、json數據、純文本、文件等結果。在ASP.NET?MVC中通過在Action(行為或操作)方法中返回ActionResult類型的對象來實現向客戶端響應上面的各種結果。

ActionResult類是個抽象類(抽象類無法直接被實例化).

ActionResult有很多實現類,不同的實現類用于響應客戶端不同的結果。并且在Controller類中提供了大量的輔助方法,這些輔助方法可以快速的創建各種ActionResult.

在實際開發中,我們更多的是使用Controller類中的輔助方法,而非自己手工創建ActionResult的實現類。

ViewResult類

ViewResult類的作用是向客戶端響應View目錄中一個視圖文件.

Controller類中提供了View()方法,來快速的返回一個ViewResult類對象.

ContentResult類

該類用于向客戶端返回一段文本內容(純文本\HTML...).

在Controller類中的輔助方法為:Controller.Content(string??content);

RedirectToRouteResult類

該類的作用是從當前action跳轉至其他action.

在Controller類中的輔助方法為:RedirectToAction(“ActionName”,“ControllerName”)

RedirectResult類

在服務器端從當前Action跳轉到其他URL地址.

在Controller類中的輔助方法為:Controller.Redirect(string??url)

JsonResult類

該類用于向客戶端返回一段Json格式的字符串.

在Controller類中的輔助方法為:Controller.Json(object??data);

注意:默認情況下mvc拒絕響應以get方式發送的ajax請求,需要使用JsonRequestBehavior.AllowGet。

PartialViewResult類

該類的作用是向客戶端響應Views目錄的一個分部視圖文件。分部視圖就是只包含html片段的視圖文件.

在Controller類中的輔助方法為:Controller.PartialView();

FilePathResult類

該類用于實現文件下載.

在Controller類中的輔助方法為:Controller.File(string??filePath,??string??contentType,?string??fileName);

EmptyResult類

該類用于向客戶端響應一個空結果。

HttpStatusCodeResult類

該類用于向客戶端相應指定的狀態碼.

HttpNotFoundResult類就是HttpStatusCodeResult的子類,表示404這一狀態碼。

下面的是一些常用的http狀態碼:

404:資源未找到(表示客戶端請求服務器的資源地址不存在)

500:服務器內部錯誤(以5XX開頭的表示服務器端在處理過程中出現的錯誤)

200:成功(表示客戶端發送的請求被服務器成功的處理和響應)

其他

如何在aspx頁面中導入命名空間?

方式一:在指定的頁面添加<%@?Import?Namespace=”命名空間”%>

方式二:在項目的web.config配置文件中添加pages---namespaces----add

通過方式二添加的命名空間可以在所有的aspx頁面中使用;而方式一添加的命名空間只能在當前頁面中使用.

ASP.NET?MVC進階三

ASP.NET?MVC中的AJAX應用

首先,在ASP.NET?MVC中使用自帶的ajax功能,必須要導入2個js文件(順序不能顛倒):

ASP.NET?MVC提供了2個常用的ajax輔助方法.

Ajax.ActionLink

該輔助方法用于在頁面上生成具有ajax功能的超鏈接.

在該輔助方法中有一個AjaxOptions類型的參數,它包括如下屬性:

Confirm:在發送ajax請求前,彈出確認對話框,該屬性就是設置對話框中的提示消息

HttpMethod:用于設置請求的類型:Get|Post

UpdateTargetId:用于設置服務器響應的結果更新到頁面中目標元素ID

InsertionMode:用于設置服務器相應的結果如何插入到被更新的元素中,它的值可以包括3種:

InsertionMode.Replace:用新值替換舊值(默認值)

InsertionMode.InsertAfter:將新值插入到目標元素的底部

InsertionMode.InsertBefore:將新值插入到目標元素的頂部

OnBegin:當執行ajax請求前,執行的js函數

OnSuccess:當執行ajax請求成功時,執行的js函數

OnFailure:當ajax請求失敗時,執行的js函數

OnComplate:當ajax請求完成后,執行的js函數(不管請求失敗或成功,都會執行)

LoadingElementId:在ajax請求期間,可以顯示一段友好的提示,該屬性用于設置提示元素的ID

LoadingElementDuration:提示元素在顯示和隱藏時,可以執行一段動畫,該屬性用于設置提示元素的動畫執行時間

Ajax.BeginForm

該ajax輔助方法用于以ajax方式提交表單數據.

其他

如何在頁面中加載分部視圖?

方式一:調用Html.RenderPartial(“viewName”)

方式二:調用Html.RenderAction(“actionName”)

何時使用RenderAction,何時使用RenderPartial?

如果需要向視圖中傳遞數據,而原視圖中又沒有需要傳遞的數據時,就需要調用RenderAction.

注意:Html.RenderPartial有多種重載形式,下面列舉它的2種常用形式:

Html.RenderPartial(“分布視圖的名稱”)

Html.RenderPartial(“分部視圖的名稱”,??object模型數據)

如何從服務器獲取一段json格式的字符串?

服務器的Action方法返回值類型為JsonResult,并且在方法內部可以調用Controller.Json()輔助方法.

ASP.NET?MVC進階四

ASP.NET?MVC中使用母版頁

ASPX視圖引擎的母版頁功能

Aspx視圖引擎中母版頁的用法,在webform模型和Mvc模型中,都是一樣的.

Aspx視圖有2個很重要的標記:

asp:ContentPlaceHolder標記

asp:Content標記

asp:Content用于替換母版頁中的asp:ContentPlaceHolder.

在母版頁中應該根據實際需要,定義多個asp:ContentPlaceHolder,而非默認的2個.

注意:在mvc中添加母版頁時一定要選擇MVC3視圖母版頁,而不能選擇下面的母版頁和嵌套的母版頁.

在MVC中,沒有提供嵌套的母版頁模版文件,需要用戶自行定義:

Razor視圖引擎

Razor視圖引擎的宗旨:將鍵盤的敲擊次數降到最低

Razor基本語法

定義變量:

輸出變量的值:

如何在頁面中原樣輸出@符號

如何在頁面中輸出hisageis5.

if-else的寫法:

for|foreach的寫法:

注意:如果在for循環中需要進行條件判斷,不需要在if前加@符號.

Html輔助方法的使用:

注意:@Html.TextBox()后面不能有分號.

在razor視圖頁面中定義數據模型的類型信息:

在razor視圖頁面中加載分部視圖或加載其他action:

注意:@{}里面的分號不能省略.

在Razor視圖中如何生成form標記:

Razor視圖引擎中母版頁的用法

Razor視圖中母版頁功能稱之為布局頁.

Razor視圖的布局頁文件名必須以下劃線_開頭.

Mvc項目中如何添加Razor布局頁:

Razor視圖中布局頁的默認代碼如下:

@RenderBody的作用同aspx視圖中的asp:ContentPlaceHolder相似,用于加載內容頁.

Razor視圖引擎中,如何讓內容頁繼承布局頁?

在內容頁中使用Layout屬性指定要繼承的布局頁.代碼如下:

其中ViewBag.Title是用于設置布局頁中的頁面title.

如果不需要內容頁繼承布局頁,只需要將Layout屬性的值設置為null.

如果沒有將Layout設置為null,而是將其刪除掉,那么內容頁仍然有可能會繼承一個默認的布局頁.因為在Views目錄中存在一個名稱為:_ViewStart.cshtml的文件,該文件是視圖的默認配置文件,它里面設置了默認的布局頁面,示例代碼如下:

嵌套的布局頁,在mvc中也沒有提供默認的模版文件,需要用戶自行添加.

Html.RenderSection()

該輔助方法用于加載html片段.該段Html代碼可以是本頁面中定義的,也可以是內容頁面中定義的.

示例代碼如下:

Razor視圖中如何自定義輔助方法

使用@helper來定義輔助方法.示例代碼如下:

在ASP.NET?MVC中如何實現模塊化開發?

對于一個系統而言,往往包含前臺和后臺兩大塊.比如,前后臺都包含用戶登錄功能,它們的控制器都叫Account,對應的登錄方法也都叫Login,那么如何區分哪個是后臺的,哪個是前臺的???

ASP.NET?MVC在2.0中就添加了Area(區域)的功能,用來解決上面的問題.

通過Area功能可以將一個大的軟件項目劃分為N個功能模塊,每個功能模塊中都可以相同名稱的控制器和視圖文件.

首先,右擊項目,在彈出的右鍵菜單中選擇----添加----區域

ASP.NET?MVC數據分頁

Aspx視圖引擎和razor視圖引擎中如何實現分頁功能

主要使用了第三方的一個分頁控件MvcPager.dll

分頁功能分三步實現:

第一步是在項目中導入MvcPager.dll,并導入相應的命名空間:Webdiyer.WebControls.Mvc

第二步是在Action中組織要分頁的數據

第三步是在頁面中生成頁碼信息

注意:MvcPager.dll包括非ajax和ajax兩種使用模式.ajax模式下需要使用Ajax.Pager輔助方法.

其他

如何在頁面中加載靜態文件(圖片\css\js)?

使用Url.Content(“filePath”)方法.

Aspx視圖引擎

Razor視圖引擎

添加新的Area后,訪問報錯的解決辦法:

修改Global.ashx文件中注冊的默認路由

ASP.NET?MVC進階五

重寫Controller類的虛方法

OnActionExecuting\OnActionExecuted

OnActionExecuting:該方法在執行目標Action之前被調用

OnActionExecuted:該方法在執行目標Action之后被調用

OnResultExecuting\OnResultExecuted

OnResultExecuting:該方法在執行目標視圖之前被調用

OnResultExecuted:該方法在執行目標視圖之后被調用

OnAuthorization

該方法用于驗證用戶的授權信息.因此如果要進行身份的驗證,應該在該方法中進行.

OnException

當訪問Action出現異常時,該方法會自動被調用.

下面的示例代碼演示了如何自動捕獲系統異常,并將異常信息記錄到日志文件中.

ASP.NET?MVC中的過濾器

過濾器是指在用戶發送請求時,MVC框架可以對用戶的請求進行攔截,根據特定的條件對這些請求進行篩選過濾.

ASP.NET?MVC中提供了下面幾種過濾器,他們的作用和上面將的重寫方法功能類似,但是這些過濾器是全局的,默認對所有的Action請求都有效.

IAuthorizationFilter

授權過濾器

IActionFilter

行為過濾器

IResultFilter

結果過濾器

IExceptionFilter

異常過濾器

注意:過濾器需要在Global.asax文件中進行注冊后方能起效.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容