Visual Studio 2010 --MVC2.0 只有aspx視圖引擎
Visual Studio 2012 --MVC3.0和MVC4.0 aspx和Razor視圖引擎
Visual Studio 2013 --MVC4.0 aspx和Razor視圖引擎
Visual Studio 2015 --MVC5.0 只有Razor視圖引擎
MVC模式簡介
MVC模式兩種理解:一種是表現模式,另外一種是架構模式。
它將應用程序分為三個主要組件即:視圖(View),控制器(Controller),模型(Model)
M:Model主要是存儲或者是處理數據的組件
Model其實是實現業務邏輯對實體類相應數據庫操作,如:CRUD。它包括數據、驗證規則、數據訪問和業務邏輯等應用程序信息。ViewModel:視圖模型
V:View是用戶接口層組件。主要是將Model中的數據展示給用戶,ASPX和ASCX文件被用來處理視圖的職責。
C:Controller處理用戶交互,從model中獲取數據並將數據傳給指定的View

[ASP.Net的兩種開發方式]
WebForm的開發方式
1.服務器端控件
2.一般處理程序+Html靜態頁+Ajax
3.一般處理程序+Html模板

ASP.Net MVC的開發方式
2009年第一個開源項目版本發布
更加簡潔,更加接近原始的“請求-處理-響應”
更加開發、更多的新的特點、社區活躍
不會取代WebForm
底層跟WebForm都是一樣的。管道上不同的處理而已

[控制器的約定大於配置]
*Controller放到controllers文件夾中,並且命名方式以Controller結尾
*每個Controller都對應View中的一個文件夾,文件夾的名稱跟Controller名相同
*Controller中的方法名都對應一個View視圖(非必須,但是建議這么做),而且View的名字跟Action的名字相同
*控制器必須是非靜態類,並且要實現IController接口
*Controller類型可以放到其他項目中
[視圖的相關約定]
*所有的視圖必須放到Views目錄下
*不同控制器的視圖用文件夾進行分割,每個控制器都對應一個視圖目錄
*一般視圖名字跟控制器的Action相對應(非必須)
*多個控制器公共的視圖放到Shared
[ViewData]傳遞數據載體
*ViewData是Controller的屬性,此屬性是繼承ControllerBase而來。
*ViewPage下也有一個ViewData的一個屬性
*控制器的Action方法執行完成后,返回ViewResult,然后MVC框架會執行ExecuteResult方法時,Controller中的ViewData數據傳遞給ViewPage類,
其實就是把Controller的ViewData賦值給ViewPage頁面的ViewData屬性
*ViewBag傳遞數據(原理參考ViewData)
MVC強類型視圖
1:view中把 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<Dynamic>" %>中Dynamic修改為具體Model
2:后台給ViewData.Model賦值
3:前台 就可以使用Model.Id 等等
強類型的HtmlHelper
<%: Html.TextBoxFor(u=>u.UserName) %>
硬編碼的HtmlHelper
<%:Html.TextBox("UserName") %>
[Html.Encode]
<%:%> 相當於<%= Html.Encode()%>
推薦大家使用<%:%>,方便簡潔
輸出特殊字符比如<script>
HtmlString和MvcHtmlString可以屏蔽冒號的編碼化
Html.Raw():也可以把字符串原封不動的輸出到頁面上,避免被編碼化。
原樣輸出:
<%:Html.Row("")%>
<%: new HtmlString("")%>
<%: new MvcHtmlString("")%>
[HtmlHelper擴展]
擴展方法的三要素:靜態類、靜態方法、this關鍵字
使用方法是: 在視圖上。引用靜態類所在的命名空間 (或者直接把靜態類的命名空間修改為HtmlHelper類的命名空間)
1 namespace System.Web.Mvc 2 { 3 public static class MyHtmlExt 4 { 5 /// <summary> 6 /// 原樣輸出 7 /// </summary> 8 /// <param name="htmlHelper"></param> 9 /// <param name="value"></param> 10 /// <returns></returns> 11 public static string Mylabel(this HtmlHelper htmlHelper, string value) 12 { 13 return string.Format("<h1>{0}</h1>",value); 14 } 15 16 /// <summary> 17 /// 編碼化 18 /// </summary> 19 /// <param name="htmlHelper"></param> 20 /// <param name="value"></param> 21 /// <returns></returns> 22 public static MvcHtmlString MyHtmlLable(this HtmlHelper htmlHelper, string value) 23 { 24 return new MvcHtmlString(string.Format("<h1>{0}</h1>", value)); 25 } 26 } 27 }
關於控制器Action參數的賦值:
//Action在執行之前,MVC框架會自動的將請求中的數據裝配到Action的參數在里面去
參數Id通過MVC路由規則傳遞參數,參數為非Id則通過QueryString方式進行傳遞參數
雙向數據裝配
1:控制器通過ViewData容器把數據傳遞到View之后,View在渲染Html標簽的時候會自動從ViewData中獲取數據進行填充標簽
2:表單提交到控制器的時候,執行控制器的Action之前會自動將表單中的內容填充到方法的參數或者參數的屬性里面去
->自動裝配
(1)在Action的形參處,使用與路由規則中同名的參數,即可以完成數據接收
(2)在頁面跳轉中,action的形參的名稱,與頁面提交的key的名稱相同
(3)將action的多個參數完成封裝,要求提交的key的名稱與action形參對應類型的屬性同名
[Razor引擎]
在MVC3.0版本的時候(Visual Studio 2012),微軟終於引入了第二種模板引擎:Razor。
Razor文件類型:Razor支持兩種文件類型,分別是.cshtml 和.vbhtml,其中.cshtml 的服務器代碼使用了c#的語法,.vbhtml 的服務器代碼使用了vb.net的語法。
Razor在減少代碼冗余、增強代碼可讀性和vs 智能感知方面,都有着突出的優勢(C#代碼和HTML代碼可以進行混編)
@字符是Razor中的一個重要符號,它被定義為Razor服務器代碼塊的開始符號,可以使用@{code}來定義一段代碼塊
Demo: <span>@DateTime.Now.ToString("yyyy-MM-hh")</span>
輸出原生的字符串:@Html.Raw(html),例如:@Html.Raw("<h1>Razor</h1>")
HtmlString類型和MvcHtmlString類型字符串輸出,例如:IHtmlString html=new HtmlString("<font color='red'>文本</font>");
Razor服務器端注釋為:@* 注釋內容 *@

[控制器詳解]
控制器三個職責:
1:處理跟用戶的交互
2:處理業務邏輯的調用
3:指定具體的視圖顯示數據,並且把數據傳遞給視圖
*控制器的約定:
必須非靜態類
必須實現IController接口
必須以Controller為結尾
*在Action中可以訪問HttpContext中所有的相關數據:比如:Session、Cookie、也可以設置響應,總之跟WebForm中Page類能做的,在Action中都能做。
-》Action:本質就是方法,可以重載
針對於Action構成重載的兩個要求:(1)參數不同;(2)必須指定請求方式
可以使用[HttpPost][HttpGet]設置行為約束
參數接收:(1)使用Request對象;(2)自動裝配
-》Action參數自動裝配的條件
要求參數的鍵的名字,與方法的形參的名字相同
在自動裝備時,會根據形參的類型,進行類型轉換
返回結果:面向抽象編程,類型為ActionResult,而實際返回是一個ActionResult的子類對象
常用的ActionResult的子類:ViewResult,ContentResult,RedirectResult,JsonResult,FileContentResult
-》Controller可以寫到一個項目中,也可以寫到多個項目中
[深入講解Controller]
Controller負責將獲取Model數據並將Model傳遞給View對象,通知View對象顯示。
一個Controller可以包含多個Action。每一個Action都是一個方法,返回一個ActionResult實例
一個Controller對應一個XxController.cs控制文件,對應在View中有一個Xx文件夾。一般情況下 一個Action對應一個aspx頁面

[MapRoute]
Global.asax.cs文件中定義了路由的識別規則
1 routes.MapRoute( 2 name: "Default", // 路由名稱,作為路由規則的key,一定不能重復 3 url: "{controller}/{action}/{id}", // 帶有參數的URL,請求后台URL規則 4 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值 5 );
//路由規則:
1:可以有多條路由規則
2:路由規則是有順序的
MapRoute()方法
MapRoute( string name, string url);
MapRoute( string name, string url, object defaults);
MapRoute( string name, string url, string[] namespaces);
MapRoute( string name, string url, object defaults, object constraints);
MapRoute( string name, string url, object defaults, string[] namespaces);
MapRoute( string name, string url, object defaults, object constraints, string[] namespaces);
MapRoute參數介紹
【name參數】: 規則名稱, 可以隨意起名.不可以重名,否則會發生錯誤:路由集合中已經存在名為“Default”的路由。路由名必須是唯一的。
【url參數】: url獲取數據的規則, 這里不是正則表達式, 將要識別的參數括起來即可, 比如: {controller}/{action}
最少只需要傳遞name和url參數就可以建立一條Routing(路由)規則.比如實例中的規則完全可以改為:
routes.MapRoute( "Default", "{controller}/{action}");
【defaults參數】: url參數的默認值.如果一個url只有controller: localhost/home/
而且我們只建立了一條url獲取數據規則: {controller}/{action}
那么這時就會為action參數設置defaults參數中規定的默認值. defaults參數是Object類型,所以可以傳遞一個匿名類型來初始化默認值:
new { controller = "Home", action = "Index" }
實例中使用的是三個參數的MapRoute方法:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults );
【constraints參數】:用來限定每個參數的規則或Http請求的類型.constraints屬性是一個RouteValueDictionary對象,
也就是一個字典表, 但是這個字典表的值可以有兩種:
1.用於定義正則表達式的字符串。正則表達式不區分大小寫。
2.一個用於實現 IRouteConstraint 接口且包含 Match 方法的對象。
通過使用正則表達式可以規定參數格式,比如controller參數只能為4位數字: new { controller = @"\d{4}"}
[Url路由總結]
-》與路由相關類型:
路由規則Route:制定路由的名稱Name、url規則、默認值Default、約束constraints
路由數據RouteData:當前上下文匹配到某個路由規則后,得到的一個對象
路由集合RouteCollection:存放路由規則對象的集合
路由表RouteTable:包含一個靜態的RouteCollection類型的屬性
簡單總結:
(1)Routing規則有順序(按照添加是的順序), 如果一個url匹配了多個Routing規則, 則按照第一個匹配的Routing規則執行.
(2)由於上面的規則, 要將具體頻道的具體頁面放在最上方, 將頻道首頁 和 網站首頁 放在最下方.
(3) {*values} 表示后面可以使任意的格式.
【關於測試Routing】
使用RouteDebug輔助類
在Global.asax添加如下代碼:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
//路由調試,放在所有代碼之后
RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}
【MVC驗證】
*.NET框架中的System.ComponentModel.DataAnnotations命名空間包括了眾多可為你所用的內置驗證特性,
介紹用的最多的其中的四個:[Required],[StringLength],[Range],[RegularExpression]
*定義自己的定制驗證特性,然后應用它們。你可以通過繼承自System.ComponentModel.DataAnnotations命名空間中的ValidationAttribute基類,定義完全定制的特性。
*屬性ErrorMessage:指定錯誤提示信息
-》使用Html.ValidationMessageFor(***)顯示校驗錯誤信息
-》在服務器端使用ModelState.IsValid判斷前台是否驗證成功
[服務器端校驗]只需要在Action中校驗:ModelState.IsValid屬性即可。true就是校驗通過,false就是不通過。
-》伙伴類:定義的類之間,可以共享元數據 [MetadataType(typeof(CustomerFriend))]
Metadata是.NET平台的核心靈魂 - leooelg 鏈接: http://pan.baidu.com/s/1jHBplhs 密碼: r7i2
-》操作步驟:
(1)生成類CutomerInfo
(2)定義部分類CustomerInfo1
(3)定義基友類CustomerFriend,要求成員的簽名與CustomerInfo中一致
(4)為CustomerInfo1中的類添加基友特性MetadataType(typeof(CustomerFriend))
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace MVCMetadataDemo.Models { [MetadataType(typeof(CustomerFriend))] public partial class CustomerInfo { public int Id { get; set; } } //部分類 實際情況下 應該位於不同的*.cs文件中,這里只是演示Demo public partial class CutomerInfo { public string CustomerName { get; set; } } public class CustomerFriend { [Required(ErrorMessage="必填字段")] public string CustomerName { get; set; } } }
*要使用[客戶端校驗],必須引入Js腳本支持(JQuery的校驗)
[
<script src="~/Scripts/jquery-1.8.2.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
]
*添加語句 <% Html.EnableClientValidation(); %>(MVC3、4中默認開啟)
*WebConfig中可以設置全局客戶端校驗是否開啟或者關閉
【JQuery Ajax】
MVC4 AspNet MVC下的Ajax / 使用JQuery做相關的Ajax請求
跟普通的WebForm的開發方式都一致的
Url地址不同點:請求的是Controller下的Action
在使用Json返回JsonResult時注意要將第二個參數設置允許Get提交方式:return Json("",JsonRequestBehavior.AllowGet)
在Ajax開發中要注意Ajax方法體內的參數設置正確
提交方式要跟Action打的標簽一致
【Asp.net MVC Microsoft Ajax】
MVC4 AspNet MVC下的Ajax / 使用微軟提供的Ajax請求腳本
*將微軟提供的腳本引入到頁面中
*注意引用的順序
*Ajax.BeginForm沒有提供閉合的方法,請使用Using配合關閉
*AjaxOptions參數的設置

*SuccessMethod只是提供提醒,並沒有數據的傳遞
[過濾器詳解]
項目大一點總會有相關的AOP面向切面的組件,而MVC(特指:Asp.Net MVC,以下皆同)項目中呢Action在執行前或者執行后我們想做一些特殊的操作
(比如身份驗證,日志,異常,行為截取等),而不想讓MVC開發人員去關心和寫這部分重復的代碼,那我們可以通過AOP截取實現,
而在MVC項目中我們就可以直接使用它提供的Filter的特性幫我們解決,不用自己實現復雜的AOP了。

-》一共有4種過濾器
[身份驗證過濾器:AuthorizeAttribute]:Authorzation filter: 一般用來實現身份校驗,在執行實際的action之前,先執行指定的身份驗證過濾器
[Action過濾器:ActionFilterAttribute] :
Ps:新建一個類 MyActionFilterAttribute:ActionFilterAttribute
ActionFilterAttribute 默認實現了IActionFilter和IResultFilter。
而ActionFilterAttribute是一個Abstract的類型,所以不能直接使用,因為它不能實例化,所以我們想使用它必須繼承一下它然后才能使用
案例:Action過濾
AttributeUsage特性用於設置標簽
[AttributeUsage(AttributeTargets.All,AllowMultiple = True)] 標記在類的級別 //AllowMultiple = true; 允許多個標簽同時都起作用
Gloable Filte允許我們設置全局過濾器
[Result過濾器:ResultFilterAttribute]:
[異常過濾器:HandleErrorAttribute]:當我們Mvc站點出現了異常的時候會自動執行異常過濾器里面的方法[繼承與HandleErrorAttribute]。
Ps:新建一個類:MyExceptionFilterAttribute:HandleErrorAttribute
要使用自定義異常處理,需要使用在web.config中為system.web添加<customErrors mode="On" />節點
重新定義一個類,后綴名稱為Attribute,繼承自HandleErrorAttribute
重寫OnException()方法
關鍵:將filterContext.ExceptionHandled=true,建議不要刪除base.***代碼
使用filterContext.Result=new RedirectResult("/Error.html");

[區域詳解]
Asp.Net MVC提供了區域的功能,可以很方便的為大型的網站划分區域。
可以讓我們的項目不至於太復雜而導致管理混亂,有了區域后,每個模塊的頁面都放入相應的區域內進行管理很方便。
在項目上右擊創建新的區域
區域的功能類似一個小的MVC項目,麻雀雖小五臟俱全,有自己的控制器、模型、視圖、路由設置
區域的路由設置是最優先的
-》在項目中添加一個區域,就相當於增加了一個子項目,管理更加方便
-》注意:需要將區域中的路由規則添加到主的路由規則中
-》在項目的Global文件中第一句注冊:AreaRegistration.RegisterAllAreas();
說明:注冊代碼在添加區域后會自動添加到Global中
[模板頁]
-》使用模板,就是做好一個頁面,在里面空出來區域,以便在子頁面中填充,快速完成頁面開發
-》對於aspx引擎,使用母版頁
-》對於razor引擎,使用布局
模板頁必須放到共享的文件夾中。
WebForm視圖引擎的模板頁跟之前的沒有什么區別。
Razor引擎引入 渲染區域的概念
所有頁面啟動的時候ViewStart文件先執行
Demo:Razor引擎模板頁 RanderBody和RenderSection
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width" /> 6 <title>@ViewBag.Title</title> 7 @Styles.Render("~/Content/css") 8 @Scripts.Render("~/bundles/modernizr") 9 </head> 10 <body> 11 @RenderSection("Header",false) 12 <h1>這里是Layout模板頁</h1> 13 @RenderBody() 14 15 @Scripts.Render("~/bundles/jquery") 16 @RenderSection("scripts", required: false) 17 </body> 18 </html>
Razor 測試視圖頁面,引用Layout.cshtml 模板頁
1 @{ 2 ViewBag.Title = "Index2"; 3 } 4 5 <h2>Index2</h2> 6 <h1>Razor Index2 子頁面</h1> 7 8 @section Header{ 9 <h1>這里是Header部分</h1> 10 }
[WebAPI]
淘寶開放平台、騰訊開放平台
WebService和WCF復雜不夠靈活
MVC4.0中發布了第一個版本的WebAPI
WebAPI:輕巧、方便就是Http請求
[Web API CRUD] [HTTP請求方法]
CURD 是指 Create 、 Update 、 Read 、 Delete 四個簡單的數據庫操作, 通常大多數 Web 服務也通過 REST 風格的服務提供這些操作。
HTTP 的四個主要方法 (GET, PUT, POST, DELETE) 按照下列方式映射為 CURD 操作:
GET 用於獲取 URI 資源的進行展示, GET 操作不應對服務端有任何影響;
PUT 用於更新 URI 上的一個資源, 如果服務端允許, PUT 也可以用於新建一個資源;
POST 用於新建 資源, 服務端在指定的 URI 上創建一個新的對象, 將新資源的地址作為響應消息的一部分返回;
DELETE 用於刪除指定的 URI 資源。

Get:一般用作查詢,多次操作得到結果一致
Post:一般用於修改、添加多次重復操作得到結果不一致。
Put:一般用於修改,多次操作得到結果一致。
Delete:一般用於刪除數據,多次操作得到結果一致。
參考代碼:鏈接:http://pan.baidu.com/s/1bnU9mj1%20 密碼:co5u
