·Models: 表示該應用程序的數據並使用驗證邏輯來強制實施業務規則的數據類。 · Views: 應用程序動態生成 HTML所使用的模板文件。 · Controllers: 處理瀏覽器的請求,取得數據模型,而後指定要響應瀏覽器請求的視圖模板。 控制器負責給任何數據或者對象提供一個必需的視圖模板,用這個視圖模板來Render返回給瀏覽器的HTML。 最佳作法是:一個視圖模板應該永遠不會執行業務邏輯或者直接和數據庫進行交互。相應的,一個視圖模板應該只和控制器所提供的數據進行交互。 維持這種"隔離關係"能夠幫助,保持代碼的乾淨、測試性和更易維護 Windows Azure是微軟基於雲計算的操做系統,和Azure Services Platform同樣,是微軟「軟件和服務」技術的名稱。 Windows Azure的主要目標是爲開發者提供一個平臺,幫助開發可運行在雲服務器、數據中心、Web和PC上的應用程序。 雲計算的開發者能使用微軟全球數據中心的儲存、計算能力和網絡基礎服務。 Azure服務平臺包括瞭如下主要組件:Windows Azure;Microsoft SQL數據庫服務,Microsoft .Net服務;用於分享、儲存和同步文件的Live服務;針對商業的Microsoft SharePoint和Microsoft Dynamics CRM服務。 MapRoute方法是使用HTTP請求路由查找到正確的控制器(controller)和行動方法,並提供了可選ID的參數。 MapRoute方法也被用於經過HtmlHelpers如ActionLink的控制器,操做方法及任何路由數據,以生成URL @Html.ActionLink("Edit", "Edit", new { id=item.ID }) ActionLink是一個幫助方法(Helper),便於動態生成指向Controller中操做方法 的HTML 超連接連接。 ActionLink方法的第一個參數是想要呈現的連接文本 (例如,<a>Edit Me</a>)。 第二個參數是要調用的操做方法的名稱(在本例中, Edit方法)。 最後一個參數是一個匿名對象(anonymous object),用來生成路由數據 ASP.NET MVC會調用不一樣的控制器類(和其內部不一樣的操做方法)這取決於傳入URL。 所使用的ASP.NET MVC的默認URL路由邏輯使用這樣的格式來斷定哪些代碼以便調用: /[Controller]/[ActionName]/[Parameters] URL 的第一部分肯定要執行的控制器類。因此 /HelloWorld 映射到 HelloWorldController 類。 URL 的第二部分肯定的行動方法上要執行的類。因此 /HelloWorld/Index 會致使 Index 的方法 HelloWorldController 類來執行。 請注意,咱們只有以瀏覽到 /HelloWorld 和 Index 方法在默認狀況下。這是由於一種方法稱爲 Index 是若是不顯式指定一個稱爲控制器的默認方法。 URL 段 ( Parameters) 第三部分是爲路由數據。 使用HttpServerUtility.HtmlEncode(對字符串進行 HTML 編碼並返回已編碼的字符串。)來保護應用程序的惡意輸入 (即 JavaScript)。 return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes); (問號) 在的 URL 是分隔符,接着的查詢字符串。& 字符分隔的查詢字符串。 佈局模板容許您在一個地方指定您的網站的 HTML 容器佈局,而後將其應用在多個頁面在您的網站。 發現@RenderBody()線。 RenderBody是在您建立的全部視圖特定頁面都顯示出來,"包裝"在佈局頁面中的佔位符。 例如,若是您選擇關於連接,在RenderBody方法內部呈現Views\Home\About.cshtml視圖。 實體框架 (一般稱做 EF) 支持一個稱爲代碼優先的發展模式。 代碼首先容許您經過編寫簡單的類來建立模型對象。(這些也被稱爲是 POCO 類,從"純老 CLR 對象。")而後,您可使上您的類,從而使很是乾淨和快速開發工做流建立的數據庫。 LocalDB是輕量級的版本的 SQL Server 表示數據庫引擎,按需啓動和運行在用戶模式下。 LocalDB 運行中的 SQL Server Express 使您可以使用數據庫的.mdf文件做爲特殊的執行模式。 一般狀況下,LocalDB 數據庫文件保存在 web 項目的App_Data文件夾中。 <add name="EFDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=SportsStore; Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\SportsStore.mdf" /> 其中,name屬性必定要跟本身的DbContext類名相一致,若是此處不一致就找不到數據庫了,它倆就是匹配做 用 。這樣寫以後EFDbContext類纔會去跟該字符串指向下的數據庫作映射。 其中的Data Source指定數據庫類型 其中Integrated Security指的是登錄類型,此處跟寫「True」做用同樣,就是能夠以windows 身份登陸,每 次登陸你就不用輸帳號密碼了。若是是「false」就是指的sql server方式登陸就要帳號密碼齊全。 其中Initial Catalog屬性就是初始數據庫名稱,字面也知道個大概,我也不詳細說了,至於他有沒有深層次 的做用我還不知道,這不是易出錯點。 其中AttachDBFilename指的是一個路徑,放mdf文件的地方,上面的寫法是指的該文件放在本身工程的 App_Data文件夾下面,AttachDBFilename=c:\SportsStore.mdf指的就是c盤根目錄下了,因此你能夠根據 這個屬性來改變訪問的mdf文件。 有三種方式將信息從控制器傳遞到視圖: 做爲一個強類型的模型對象。 以下這一行代碼表示將一個movies列表從控制器傳遞到了視圖中。 return View(movies.ToList()); 做爲一種動態類型 (使用 @model 動態) @model指令以提供一個更乾淨簡潔的方式來指明你想要在視圖文件中引用強類型模型類 @model MvcMovie.Models.Movie 此@model聲明使得控制器能夠將強類型的Model對象傳遞給View視圖, 從而您能夠在視圖裏訪問傳遞過來的強類型電影Model。 @model IEnumerable<MvcMovie.Models.Movie>此@model聲明使得控制器能夠將強類型的電影列表Model對象傳遞給View視圖。 例如,在Index.cshtml模板中,在強類型的Model對象上使用foreach語句循環遍歷電影列表 使用 ViewBag 數據是使用模型聯編程序 採起從 URL 和傳遞給控制器。 控制器的數據打包成一個ViewBag對象,並將該對象傳遞給視圖。視圖而後是向用戶顯示爲 html 格式的數據。 一個控制器可使用ViewBag對象來將數據或對象傳遞到視圖模板中。 ViewBag是一個動態對象,它提供了一種便利的,後期綁定的方法來將信息從控制器傳遞到視圖中。 你能夠爲它添加任何屬性並賦上屬性值。在未賦值以前該屬性是不生效的,直到你賦值爲止。 例如: public ActionResult Welcome(string name, int numTimes = 1) { ViewBag.Message = "Hello " + name; ViewBag.NumTimes = numTimes; return View(); } ViewBag對象中已經包含了數據,它將被自動傳遞給視圖。 DAtaAnnotaions 的屬性-- 命名空間:System.ComponentModel.DataAnnotations Required:標識該屬性爲必需參數,不能爲空 StringLength:標識該字符串有長度限制,能夠限制最小或最大長度 Range:標識該屬性值範圍,一般被用在數值型和日期型 RegularExpression:標識該屬性將根據提供的正則表達式進行對比驗證 CustomValidation:標識該屬性將按照用戶提供的自定義驗證方法,進行數值驗證 DataType屬性用於指定一個比數據庫內部類型更加具體的一種數據類型,但它們不是驗證屬性 該DisplayFormat的屬性是用來顯式地指定日期格式的 [StringLength (60,MinimumLength=3)] public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] [Required][StringLength(30)] public string Genre { get; set; } [Range(1, 100)] [DataType(DataType.Currency)] public decimal Price { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] [StringLength(5)] public string Rating { get; set; } DataType屬性的優點: 瀏覽器能夠啓用HTML5功能(好比顯示日曆控件,本地化的貨幣符號,電子郵件連接,客戶端輸入驗證等) 默認狀況下,瀏覽器將使用基於本地區域設置的正確格式來呈現數據 DataType屬性可讓MVC自動選擇正確的字段模板來呈現數據(DisplayFormat使用字符串模板) 一 Html.ActionLink("linkText","actionName") 該重載的第一個參數是該連接要顯示的文字,第二個參數是對應的控制器的方法, 默認控制器爲當前頁面的控制器,若是當前頁面的控制器爲Products,則 Html.ActionLink("detail","Detail") 則會生成 <a href="/Products/Detail">all</a> 二 Html.ActionLink("linkText","actionName","controlName") 該重載比第一個重載多了一個參數,他指定了控制器的名稱, 如Html.ActionLink("detail","Detail","Products")則會生成 <a href="Products/Detail">all</a> 三 Html.ActionLik("linkText","actionName",routeValues) routeValue能夠向action傳遞參數,如Html.ActionLink("detail","Detail",new { id=1}) 會生成 <a href="Products/Detail/1">detail</a>, 此處假設當前的控制器是Products. 四 Html.ActionLink("linkText","actionName",routeValues,htmlAttributes) htmlAttribute能夠設置<a>標籤的屬性, 如 Html.ActionLink("detail","Detail",new{id=1},new{ target="_blank"}) 會生成 <a href="Products/Detail/1" target="_blank">detail</a>, 須要主要的是若是寫成 new{ target="_blank",class="className"}則會報錯, 由於class是關鍵字,此處應該寫成 @class="className"。 @Html.TextBoxFor(a=>a.Name)和@Html.TextBox("Name")實質是同樣的 顯示結果也同樣 區別: 一種強類型的HtmlHelper編程方式 一種是手寫字符串的方式 http協議默認先以get方式獲取數據,不管是否以哪一種方式發起的,老是get方式優先,即經過get方式獲取到了數據就不會再去經過post方式獲取一遍,若是get方式獲取不到,再以post方式獲取 post和get的區別? 1. get是從服務器上獲取數據,post是向服務器傳送數據。 2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到。post是經過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一塊兒傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。 3. 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。 4. get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,通常被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。 5. get安全性很是低,post安全性較高。可是執行效率卻比Post方法好。 建議: 一、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式; 二、在作數據查詢時,建議用Get方式;而在作數據添加、修改或刪除時,建議用Post方式; MVC Html.AntiForgeryToken() 防止CSRF攻擊 MVC中的Html.AntiForgeryToken()是用來防止跨站請求僞造(CSRF:Cross-site request forgery)攻擊的一個措施, 它跟XSS(XSS又叫CSS:Cross-Site-Script),攻擊不一樣,XSS通常是利用站內信任的用戶在網站內插入惡意的腳本代碼進行攻擊, 而CSRF則是僞形成受信任用戶對網站進行攻擊。 ValidationSummary 控件用於在網頁、消息框或在這二者中內聯顯示全部驗證錯誤的摘要。 在該控件中顯示的錯誤消息是由每一個驗證控件的 ErrorMessage 屬性規定的。 若是未設置驗證控件的 ErrorMessage 屬性,就不會爲那個驗證控件顯示錯誤消息。 派生類是子類 基類是父類 基類派生子類 子類繼承基類 基類是老子,派生類是兒子,若是派生類被繼承了,就是有孫子了 子類(派生類) 父類(基類) 1.子類擁有父類全部的成員. 2.protected 修飾的成員只能在本類和子類中訪問. 3.建立子類對象的時候,在子類對象中會爲子類對象的字段開闢空間 也會爲父類對象的全部字段開闢空間. 只不過父類私有的成員訪問不到而已。 4.子類從父類繼承父類全部的非私有成員. 5.base關鍵字能夠調用父類的非私有成員. 6.子類的訪問級別不能比父類高. 7.建立子類對象的時候,1.調用子類的構造函數 2.調用父類的構造函數 3.執行父類的構造函數 4.執行子類的構造函數. 8.子類的構造函數後面默認加了1個 :base() 經過這個調用父類的無參數的構造函數. 9.若是父類沒有無參數的構造函數 將會報錯,由於子類的構造函數默認會調用父類的無參數的構造函數. 10.使用base關鍵字能夠顯示的指定子類構造函數調用父類有參的構造函數. 1. 爲何要調用父類的構造函數 父類的構造函數會初始化父類屬性的值. 續: 1. 繼承的好處:方便代碼管理. 子類能夠擁有父類的非私有成員 爲了多態. 2. 子類的構造函數.默認會去調用父類的無參數的構造函數. 3. 顯示指定子類構造函數調用的父類構造函數 base 4. 建立子類對象的內存圖. 5. this 能夠點出子類的全部成員和父類的非私有成員 base能夠點出父類的非私有成. 只包含屬性 不包含方法的類叫作實體類 把全部動做(方法和事件)放在另外的類中, 叫作控制類 DbSet 表示上下文中給定類型的全部實體的集合或可從數據庫中查詢的給定類型的全部實體的集合 overload是重載 override是覆蓋 默認狀況下BeginForm 使用POST方式提交表單數據,這意味着參數經過HTTP消息正文傳遞而不是經過URL查詢字符串。 當你指定使用HTTP GET時,表單數據經過URL查詢字符串來傳遞,這樣能夠容許用戶將URL保存爲書籤。W3C guidelines for the use of HTTP GET推薦你應該在不會更新數據的方法中使用GET方式。 DbContext 在讀取一個實體並將其呈現到頁面上後就會被銷燬, 當HttpPost Edit方法被調用,此時會生成一個新的請求和DbContext 實例,因此你必須手動設置實體狀態爲Modified, 而後當你調用SaveChanges方法時,Entity Framework 會更新數據庫行的全部列,由於數據庫上下文沒有辦法知道你到底更改了哪些屬性。 彈性鏈接(瞬時錯誤的自動重試)和命令攔截(捕獲全部發送到數據庫的SQL查詢語句並記錄至日誌中)