-》MVC→請求 處理 相應
原理:客戶端請求url→Controller→Model→Data Provider(sql server)
→View(將數據返回給視圖)
1.一種編程模式,分爲3部分:模型、視圖和控制器
->模型:表示程序的數據和狀態的代碼。包括業務邏輯、數據庫和底層之間的相互操做和驗證規則
->視圖:用戶界面,模型和視圖是一對一或者一對多,模型的操做都應該是經過所關聯的視圖的變化反映出了的
->控制器:模型和視圖之間的調節周旋,用戶對視圖的操做用過控制器響應給模型
2.優勢:清晰的區分每一個單元,適合許多開發人員開發一個項目
單元測試變的簡單
缺點:複雜性大,開發效率低,不適合小型、開發週期緊急的應用程序
3.Razor視圖引擎?NuGet包管理系統?
4.MVC支持在應用程序中的組件之間實現"更清晰的關注點分離"(這是須要特別當心的)?
5.控制器的定義:MVC中的控制器,主要負責相應用戶的輸入,一般狀況隨着輸入會修改模型。
控制器主要關注的是應用程序流,和輸入數據的處理,和相關視圖輸出數據的提供。
6.MVC在web環境中工做的原理:MVC提供的是方法調用的結果,而不是動態生成的頁面
7.MVC控制器中的index()方法負責決定當瀏覽網站首頁時觸發的事件
------------------約定---------------------
Controller放在controllers文件夾中,而且命名方式以XxController名字結尾
每一個Controller都對應View中的一個文件夾,而且跟Controller名相同
Controller中的方法名都對應一個View(非必須,但建議這麼作),並且View的名字和Action的名字相同
-------------------------開發流程-------------------------
新建Controller
建立Action
根據Action建立View
在Action獲取數據並生產ActionResult傳遞給View
View是顯示數據的模板
url請求→Controller.Action處理→View響應
--------------------------MVC優勢---------------------
1.很容易將複雜的應用分紅M、V、C模型 有效簡化了複雜的結構,體現了很好的分離原則
2.由於沒有使用server-based forms。控制起來更加靈活,頁面更加乾淨
3.能夠控制生成自定義的url。seo友好的url
4.強類型View實現,更安全、更可靠、更高效
5.讓web開發能夠專一於某一層。更利於分工配合適合用於大型構架開發
6.不少企業已經開始使用MVC做爲開發框架 MVC+EF+WCF
------------Global-------------------
路由集合中已經存在名爲「Default」的路由。路由名必須是惟一的。
MapRoute
對於一個網站,爲了SEO友好,一個網址的URL層次不要超過三層
域名第一層,頻道第二層,網頁最後一層 使用默認實例中的"{controller}/{action}/{其餘參數}"會影響網站的SEO
(1)Routing 規則有順序(按照的是添加的順序),若是一個url匹配了多個Routing規則,則按照第一個匹配的Routing規則執行
(2)因爲上面的規則,要將具體頻道的具體頁面放在最上方,將頻道首頁和網站首頁放在最下方
(3){*values}表示後面可使任意的格式
測試Routing
用於測試url寫錯或順序不對問題,藉助於RouteDebug輔助類(插件dll)
添加這個RouteDebug.dll到項目中,而且添加引用
在Application_Start方法中添加一句話:
RouteDebug.Routebugger.RewritesForTesting(RouteTable.Routes);
-----------------------Controller/Action--------------------
1.Controller負責獲取Model並將Model數據傳遞給View對象,通知View對象顯示
2.在ASP.NET MVC中,一個Controller能夠包含多個Action,每個Action都是一個方法,返回一個ActionResult實例
ActionResult類包括ExecuteResult方法,當ActionResult對象返回後會執行此方法
->頁面處理流程
發送請求→UrlRoutingModule捕獲請求→MVCRoutingHandler.GetHttpHandler()→MVCHandler.ProcessRequest()
->MVCHandler.Processrequest()處理流程
使用工廠方法獲取具體的Controller→Controller.Execute()→釋放Controller對象
->Controller.Execute()處理流程
獲取Action→調用Action方法獲取返回的ActionResult→調用ActionResult.ExecuteResult()方法
->ActionResult.ExecuteResult()處理流程
獲取IView對象→根據IView對象中的頁面路徑獲取Page類→調用IView.RenderView()方法(內部調用Page.RenderView方法)
-----------------------------------View/Model-------------------------------------:
在MVC中,Model對象是指包含了數據的模型
Controller將Model傳遞給View之後,View對象中不該該作任何的業務邏輯處理,僅僅根據Model對象作一些顯示邏輯的處理
傳遞Model對象時,有兩種選擇:
1.傳遞一個弱類型的集合,即成員爲Object類型的集合,在View中須要將每一個成員轉換爲咱們須要的類型,好比in,string,自定義類型等等
2.傳遞強類型對象,這些類型是咱們自定義的。在View中直接使用咱們傳遞的強類型對象,不須要再轉換類型
->如何傳遞
ASP.NET MVC 框架定義了ViewContext類,直譯後是"View上下文",其中保存和View有關的全部數據,其中Model對象也封裝在了此類型中
ViewContext對象包含三個屬性:
·IView View
·ViewDataDictionary ViewData
·TempDataDictionary TempData
ViewData和TempData是用來存儲Model對象的。
Controller的View方法會將Controller類的ViewData和TempData屬性值傳遞給ViewResult
ViewData和TempData的區別(均可以傳遞弱類型數據)
·ViewData的生命週期和View相同,只對當前View有效
·TempData保存在Session中,Controller每次執行請求的時候會從Session中獲取TempData並刪除Session,獲取完TempData數據後雖然保存在內部的字典對象中,可是TempData集合的每一個條目訪問一次後就從字典表中刪除。也就是說TempData的數據至多隻能通過一次Controller傳遞
3.HtmlHelper(內部定義了各類擴展方法)--System.Web.Mvc.Html
有七個靜態類組成:FormExtensions InputExtensions LinkExtensions SelectExtensions TextAreaExtensions ValidationExtensions RenderPartialExtensions
1>FormExtensions
BeginForm 主要實現表單定義的開始部分
BeginRouteForm 主要實現表單定義的開始部分,其中以路由的方式設置Action的值
EndForm 主要實現表單定義的結束部分 Html.EndForm()=</form> 也能夠用using語句,替代Html.EndForm()
2>InputExtensions
CheckBox主要實現複選框控件
Hidden 定義表單中有關變量的隱藏數值
Password主要實現輸入密碼的文本框
RadioButton主要實現單選按鈕控件
TextBox主要實現輸入的單行文本框
3>LinkExtensions
ActionLink主要實現一個鏈接
RouteLink主要實現一個鏈接
4>RenderPartialExtensions
RenderPartial用於顯示用戶控件
5>SelectExtensions
DropDownList實現下拉列表框
ListBox實現一個列表框
6>TextAreaExtensions
TextArea實現多行文本框
7>ValidationExtensions
ValidationMessage設置驗證框,不正確會變成紅色,右邊會出現一個*
ValidationSummary顯示驗證摘要
--------------------------------------------------------------------ViewEngine解析------------------------------------------------------------------
爲何使用ViewEngine,ViewEngine的做用?
答:asp.net webform頁面自帶語法和功能,編譯頁面,輸入HTML,爲了繼續使用ASP.NET WebForm的頁面引擎,asp.net mvc抽象出來了viewengine
做用就是爲了找到view對象,編譯view對象中的語言代碼實行語言邏輯,並輸入HTML
1.IView接口
IView接口是MVC結構中對View對象的抽象,此接口只有一個方法:
void Render(ViewContext viewcontext,TextWriter textwriter);
render 方法是對View對象的展現,一般是將HTML寫入到Writer中供瀏覽器展現
--------------------------------------Razor語法(最新標準)--------------------------------------------
·輸出@符號:@@
·輸出Email地址:Razor模板會自動識別出Email地址,因此不須要咱們進行任何的轉換。而在代碼塊中,只須要使用@:Tom@gmial.com便可。@: 表示後面的內容爲文本
·輸出HTML代碼(包含標籤):直接輸出,string html="<font color=\"red\">文本</font>";@html
·輸出HTML內容(不包含標籤):
有兩種方法,第一種:IHtmlString html=new HtmlString("<font color=\"red\">文本</font>");@html;第二種:string html="<font color=\"red\">文本</font>";@Html.Raw(html);html
--------------------------------------------Filter (AOP-aspect oriented programming 切面編程)------------------------------
1.Filter即爲過濾器
2.asp.net mvc中,有三種攔截器,Action攔截器,Result攔截器和Exception攔截器
3.攔截器要繼承FilterAttribute基類,Action攔截器還要實現IActionFilter接口,而Exception攔截器須要實現IExceptionFilter接口
Exception攔截器最後一行filterContext.ExceptionHandled=true;(很重要),告訴系統,異常已經處理,不要再次處理了
4.Filter的適用情景:
->判斷登陸與否或用戶權限
->決策輸出緩存
->防盜鏈
->防蜘蛛
->本地化與國際化設置
->實現動態Action
5.asp.net MVC提供瞭如下幾種默認的Filter:
Filter Type 實現接口 執行時間 Default Implementation
Authorization IAuthorizationFilter 在全部Filter和Action執行以前執行 AuthorizeAttribute
Action filter IActionFilter 分別在Action執行以前和以後執行 ActionFilterAttribute
Result filter IResultFilter 分別在Action Result執行以前和以前 ResultFilterAttribute
Exception filter IExceptionFilter 只有在filter,或者action metod,或者 HandleErrorAttribute
action result拋出一個異常時候執行
6.Action執行前:OnActionExecting方法先執行→Action執行→OnActionExecuted方法執行→OnResultExecuting方法執行→返回的ActionResult中的executeResult方法執行→OnResultExecuted執行
7.全局Filter
在Global.asax中:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//註冊全局過濾器
filters.Add(new TestFilterAttribute(){Message="全局"});
}
8.默認狀況下Action上TestFilterAttribute標籤後,雖然在Controller上也打上了此標籤,單它只有Action上的標籤做用了。
補充:若是Action沒有打上TestFilterAttribute標籤,那麼Controller上的標籤便會被執行
要想Controller和Action上的Filter都執行,須要加上這一句話:
[AttributeUsage(AttributeTargets.All,AllowMulitiple=true)]便可
9.AcceptVerbs規定頁面的訪問形式,如:
[AcceptVerbs(HttpVerbs,Post)]
public ActionResult Example(){
return View();
}
頁面只能以Post形式訪問,即表單提交。
10.ActionName
規定Action的名稱
應用場景:若是不想用方法名做爲Action名,或Action名爲關鍵字的話,如:
[AcitonName("class")]
public AcitonResult Example(){
return View();
}
11.NonAction
當前方法僅是普通方法不解析爲Aciton
12.OutputCache
爲Action添加緩存
[OutputCache(Duration=60,VaryByParam="*")]
public ActionResult Example()
{
return View();
}
13.ValidateInput
該Action能夠接受Html等危險代碼(ASP.NET MVC在aspx中設置<%@Page的屬性沒法完成等同任務)
[ValidateInput(false)]
public ActionResult Example()
{
return View();
}
14.ValidateAntiForgeryTokenAttribute
用於驗證服務器篡改
[ValidateAntiForgeryToken]
public ActionResult Example()
{
return View();
}
-------------------------------------------MVC+EF-----------------------------------
1.注意點:修改,以往作法是先把數據查出來,而後在修改,而後再放回數據庫
小技巧
EF上下文.實例名.Attach(頁面傳過來的實例);
EF上下文.ObjectStateManager.ChangeObjectState(實例,System.Data.EntityState.Modified);
EF上下文.SaveChanges();web