溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET MVC 3中如何理解控制器與視圖

發布時間:2021-11-26 17:53:02 來源:億速云 閱讀:206 作者:柒染 欄目:編程語言

本篇文章給大家分享的是有關ASP.NET MVC 3中如何理解控制器與視圖,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

I:控制器和視圖的基礎概念

1.控制器的概念

控制器在ASP.NET MVC3當中是最終處理客戶端請求的一個實現,他有個一硬性條件就是必須實現System.Web.Mvc.IController接口,而且類的命名必須要以Controller結尾,盡管按照硬性條件上來說,要自己實現一個接口比較糾結,但幸好的是在ASP.NET MVC3內部已經包含了一個默認的實現,我們只需要把類的命名設置為Controller結尾然后繼承System.Web.Mvc.Controller類,立刻就可以輕松地實現了IController接口了.如果你不喜歡這種默認提供的實現方式,而是自己去實現IController的話.下面的代碼可以做一個簡單的參考:

usingSystem.Web.Mvc;  usingSystem.Web.Routing;  namespaceMvcApplication1.Controllers  {  publicclassNoDefaultController: IController  {  voidIController.Execute(RequestContextrequestContext)  {  varhttpContext = requestContext.HttpContext;  varresponse = httpContext.Response;  response.ContentType = "text/html; charset=utf-8";  response.Write("自己的簡單實現! Hello World");  }  }  }

請注意:控制器類不硬性要求放在*.Controllers命名空間中

ASP.NET MVC 3中如何理解控制器與視圖

如果是使用繼承默認的類去實現的話代碼如下:

usingSystem.Web.Mvc;  namespaceMvcApplication1  {  publicclassHelloController: Controller  {  publicActionResultIndex()  {  returnContent("默認的實現! Hello World");  }  }  }

效果圖我就不發了.大家可以手動試一試.

2.視圖的概念

視圖的理解比較簡單.你可以把視圖理解為*.aspx或*.cshtml的文件.但是不是所有的aspx, cshtml文件都可以作為視圖,它們必須得屬于某一個以控制器名稱命名的文件夾當中,而且要按照約定去存放到路徑 ~/Views/{controller}/View.cshtml.

另外視圖還包含解析他的ViewEngine(視圖引擎),本文在這里不涉及這個高級話題.

ASP.NET MVC 3中如何理解控制器與視圖

我們可以看出在~/Views/{controller}/View.cshtml中的{controller}并不需要像類命名那樣以Controller結尾去做文件夾名稱.

3.工作原理圖

ASP.NET MVC 3中如何理解控制器與視圖

當然,內部的工作原理會比這個圖復雜得多.在此也僅僅是讓大家有個了解而已!如有錯誤請指出.謝謝!

提示:MvcHandler實現了IHttpAsyncHandler, IHttpHandler, IRequiresSessionState這三個接口,我在Debug進去的時候發現都是走異步的路線.對于這個處理方式,了解的人希望可以為我解答一下!

II:控制器

1.操作方法

操作方法的含義是指在繼承了System.Web.Mvc.Controller類中所定義的返回值的類型可以兼容ActionResult的方法.

usingSystem.Web.Mvc;  namespaceMvcApplication1.Controllers  {  publicclassHomeController: Controller  {  ///<summary>   ///Hi, 我是Index操作方法  ///</summary>  ///<returns></returns>  publicActionResultIndex()  {   ViewBag.Message = "Welcome to ASP.NET MVC!";  returnView();  }  ///<summary>  ///厄, 我是About操作方法  ///</summary>  ///<returns></returns>  publicActionResultAbout()  {  returnView();  }  ///<summary>  ///可以為方法添加不是操作方法的特性  ///</summary>  ///<returns></returns>  [NonAction]  publicstringNonAction()  {  return"親,不好意思噢.我不是操作方法噢,請不要亂調用噢!";  }  }  }  同時也可以使用[ActionName(“重命名操作方法”)]特性去重命名操作方法.  [ActionName("NewActionName")]  publicActionResultRenameAction()  {  returnContent("利用特性換個馬甲");  }

ASP.NET MVC 3中如何理解控制器與視圖

2.操作方法的返回值類型的種類

目前ASP.NET MVC3默認提供了11種ActionResult的實現

在System.Web.Mvc命名空間

ActionResult

ContentResult

EmptyResult

FileResult

HttpStatusCodeResult

HttpNotFoundResult

HttpUnauthorizedResult

JavaScriptResult

JsonResult

RedirectResult

RedirectToRouteResult

ViewResultBase

PartialViewResult

ViewResult

代碼示例:

usingSystem.Web.Mvc;  namespaceMvcApplication1.Controllers  {  publicclassActionResultController: Controller  {  publicActionResultIndex()  {  returnView();  }  publicActionResultContentResult()   {  returnContent("Hi, 我是ContentResult結果");  }  publicActionResultEmptyResult()  {  //空結果當然是空白了!  //至于你信不信, 我反正信了  returnnewEmptyResult();  }  publicActionResultFileResult()  {  varimgPath = Server.MapPath("~/demo.jpg");  returnFile(imgPath, "application/x-jpg", "demo.jpg");  }   publicActionResultHttpNotFoundResult()  {  returnHttpNotFound("Page Not Found");  }  publicActionResultHttpUnauthorizedResult()  {  //未驗證時,跳轉到Logon  returnnewHttpUnauthorizedResult();  }  publicActionResultJavaScriptResult()  {  stringjs = "alert(\"Hi, I'm JavaScript.\");";  returnJavaScript(js);  }  publicActionResultJsonResult()  {  varjsonObj = new {  Id = 1,  Name = "小銘",  Sex = "男",  Like = "足球" };  returnJson(jsonObj, JsonRequestBehavior.AllowGet);  }  publicActionResultRedirectResult()   {  returnRedirect("~/demo.jpg");  }  publicActionResultRedirectToRouteResult()  {  returnRedirectToRoute(new{  controller = "Hello", action = "" });  }  publicActionResultViewResult()  {  returnView();  }  publicActionResultPartialViewResult()  {  returnPartialView();  }  //禁止直接訪問的ChildAction  [ChildActionOnly]  publicActionResultChildAction()  {  returnPartialView();  }  //正確使用ChildAction  publicActionResultUsingChildAction()  {  returnView();  }  }  }

請注意,個別的操作方法結果在執行時,他們返回的HTTP狀態碼及ContentType有差別的.~另外如果要知道ContentType到底有多少種設置可參考

3.操作方法的參數

在本小節,我僅僅演示如何使URL參數映射到操作方法的參數,對于更復雜的用法,我將會留到 模型 的章節去講解.

首先我們需要先添加一個新的路由映射,然后在設置3個占位符參數,它們分別是p1, p2, p3.然后將p1約束為僅字母與數字的組合,p2約束為僅數字,p3沒有添加約束.

routes.MapRoute(  "UsingParams",  "p/{p1}/{p2}/{p3}",  new{  controller = "Home",  action = "UsingParams" },  new{ p1 = "[a-z0-9]+", p2 = @"d+"}  );

在添加一個Home控制器的操作方法

publicActionResultUsingParams(stringp1, intp2, stringp3)  {  stringoutput = string.Empty;  output += "p1 = "+ (p1 ?? "null");  output += "<br />p2 = " + (p2.HasValue p2.Value.ToString() : "沒有值");  output += "<br />p3 = "+ (p3 ?? "null");  returnContent(output);  }

運行效果

ASP.NET MVC 3中如何理解控制器與視圖

這里在弄一個仿YouKu的URL路由設置

ASP.NET MVC 3中如何理解控制器與視圖

路由設置

routes.MapRoute(  "YouKu_Show",  "v_{action}/id_{id}.html",  new{ controller = "YouKu"},  new{ id = "[a-z0-9]{13}"},  newstring[] { "MvcApplication1.YouKu"}  );  routes.MapRoute(  "YouKu_PlayList",  "v_{action}/{id}.html",  new{ controller = "YouKu"},  new{ id = "[a-z0-9]{12}"},  newstring[] { "MvcApplication1.YouKu"}  );

詳細代碼文末會放出.

III:視圖

1.視圖的語法在很早的時候我已經寫過一篇文章了.在此就略過不提.

2.視圖與控制器之間如何進行數據交互

在前面的接觸當中,我們已經對控制器和視圖有一定的了解了.接著,我們將要了解他們之間的幾種常用的數據交互方式.注意:ASP.NET MVC不存在IsPostBack.如果你需要把WebForm和MVC相結合.那么很抱歉,我個人非常反對這種方式.因為選擇MVC的主要原因就是不希望再與runat=server打交道(當然你用ASP.NET開發而不去runat=server的話,是可以實現的).另一點MVC也方便測試.~在過去,如果你要對ASP.NET進行測試,我們可以設想一下,對每個需要測試的runat=server的服務器控件去設置一個預設值的話,由于屬性繁多,復雜程度已經可想而知了.另外從根源上并不能保證都能發現所有問題.~或許我的這個測試ASP.NET的猜想根本不成立.而測試的時候往往還需要每Builder一次,然后對需要測試的頁面逐個測試檢查什么按鈕之類的..OK,這些傷心事就不在提了.下面介紹下MVC下的數據交互有那幾種方式.

2.1 ASP.NET MVC不在有IsPostBack,如何實現處理GET,POST?

首先我帖出一段簡單的代碼去為你展示ASP.NET MVC3下處理GET, POST的方式

//默認是處理Get請求,當然你也可以顯式添加  [HttpGet]  publicActionResultUsingViewBag()  {  returnView();   }  //顯式將操作方法設置處理Post請求  [HttpPost]  publicActionResultUsingViewBag(stringinput)  {  if(string.IsNullOrWhiteSpace(input))  {  ViewBag.Msg = inputBlank;  }  else {  ViewBag.Msg = "你輸入了: "+ input;  }  returnView();  }

在這里你會發現在ASP.NET MVC下是用[Http*]或[AcceptVerbs(HttpVerbs.*)]特性去實現類似WebForm下的IsPostBack.

2.2 ASP.NET MVC3的數據交互方式種類

A:ASP.NET原生的Request,Response.

System.Web.Mvc.Controller的成員:HttpContext, Request, Response, Session, User都跟WebForm下的類似.

Request.QueryString,Request.Form,Request.Cookies,RouteData.Values等.

B:ASP.NET MVC3自帶的ViewData,ViewBag,TempData

usingSystem.Web.Mvc;  namespaceMvcApplication1.Controllers  {  publicclassParamsController: Controller  {  stringinputBlank = "你輸入了空白";   publicActionResultIndex()  {  returnView();  }  //默認是處理Get請求,當然你也可以顯式添加  [HttpGet]  publicActionResultUsingViewBag()  {  returnView();  }  //顯式將操作方法設置處理Post請求  [HttpPost]  publicActionResultUsingViewBag(stringinput)  {  if(string.IsNullOrWhiteSpace(input))  {  ViewBag.Msg = inputBlank;  }  else {  ViewBag.Msg = "你輸入了: "+ input;  }  returnView();  }  publicActionResultUsingViewData()  {  returnView();  }  [HttpPost]  publicActionResultUsingViewData(stringinput)  {  if(string.IsNullOrWhiteSpace(input))  {  ViewData["msg"] = inputBlank;  }  else {  ViewData["msg"] = "你輸入了: "+ input;  }  returnView();  }  publicActionResultUsingTempData()  {  returnView();   }  [HttpPost]  publicActionResultUsingTempData(stringinput)  {  if(string.IsNullOrWhiteSpace(input))  {  TempData["msg"] = inputBlank;  }  else {  TempData["msg"] = "你輸入了: "+ input;  }   returnView();  }  }}

更詳細的討論,或許得另寫一遍文章了.下一篇寫Model,另外關于@Html的擴展方法,我打算另外寫一篇去介紹.

IV:源代碼下載

ASP.NET MVC 3中如何理解控制器與視圖

以上就是ASP.NET MVC 3中如何理解控制器與視圖,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女