這篇文章主要介紹了ASP.NET MVC中控制器的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),公司以成都做網(wǎng)站、網(wǎng)站建設(shè)、系統(tǒng)開(kāi)發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶(hù)近1000家,涉及國(guó)內(nèi)多個(gè)省份客戶(hù)。擁有多年網(wǎng)站建設(shè)開(kāi)發(fā)經(jīng)驗(yàn)。為企業(yè)提供專(zhuān)業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過(guò)專(zhuān)業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶(hù)提供各種風(fēng)格的特色服務(wù)。
1.理解控制器
MVC控制器負(fù)責(zé)響應(yīng)對(duì)ASP.NET MVC網(wǎng)站發(fā)起的請(qǐng)求。每一個(gè)瀏覽器請(qǐng)求都映射到了一個(gè)專(zhuān)門(mén)的控制器。舉個(gè)例子,設(shè)想一下你在瀏覽器地址欄輸入了下面的URL:
localhost/product/index/3
在這種情況下,將會(huì)調(diào)用一個(gè)名為ProductController的控制器。ProductController負(fù)責(zé)生成對(duì)瀏覽器請(qǐng)求的響應(yīng)。舉個(gè)例子,控制器可能會(huì)返回一個(gè)特定的視圖,或者是將用戶(hù)重定向到另一個(gè)控制器。
你可以通過(guò)在ASP.NET MVC應(yīng)用程序的Controllers文件夾下添加一個(gè)新的控制器來(lái)創(chuàng)建一個(gè)新控制器。右鍵點(diǎn)擊控制器的文件夾,并且選擇菜單項(xiàng)“Add(添加)”,“New(新建項(xiàng))”,并選擇“MVC Controller Class(MVC控制器類(lèi))”(見(jiàn)圖1)??刂破鞯拿直仨毢蠧ontroller后綴。舉個(gè)例子,控制器名稱(chēng)ProductController沒(méi)什么問(wèn)題,但是控制器Product就不起作用。
如果你創(chuàng)建一個(gè)新的名為ProductController的控制器,那么你將會(huì)獲得代碼清單1所示的文件。
代碼清單1 – ProductController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class ProductController : Controller { public ActionResult Index() { // Add action logic here throw new NotImplementedException(); } } }
如同你在代碼清單1中所看到的,控制器不過(guò)是一個(gè)類(lèi)(Visual Basic.Net 或者是C#類(lèi))。一個(gè)控制器是一個(gè)繼承自System.Web.Mvc.Controller基類(lèi)的類(lèi)。因?yàn)榭刂破骼^承自這個(gè)基類(lèi),所以控制器輕松地繼承了一些有用的方法(我們不久將會(huì)討論這些方法)。
2. 理解控制器動(dòng)作
控制器暴露出控制器動(dòng)作。動(dòng)作是控制器的一個(gè)方法,當(dāng)你在瀏覽器地址欄輸入某一特定的URL時(shí),將會(huì)調(diào)用這個(gè)方法。舉個(gè)例子,假設(shè)你對(duì)下面這個(gè)URL發(fā)出請(qǐng)求:
localhost/Product/Index/3
在本例中,Index()方法在ProductController類(lèi)上被調(diào)用。Index()方法是控制器動(dòng)作的一個(gè)例子。
一個(gè)控制器動(dòng)作必須是控制器類(lèi)的一個(gè)公共方法。C#方法,默認(rèn)時(shí),是私有方法。意識(shí)到你添加到控制器類(lèi)中的任何公共方法都會(huì)自動(dòng)被暴露為控制器動(dòng)作(你必須非常小心,因?yàn)榭刂破鲃?dòng)作可以被全球的任何人調(diào)用,僅僅簡(jiǎn)單地通過(guò)在瀏覽器地址欄輸入正確的URL)。
控制器動(dòng)作還要滿(mǎn)足一些額外的需求。作為控制器動(dòng)作來(lái)使用的方法不能夠重載。另外,控制器動(dòng)作不能為靜態(tài)方法。除了這些以外,你可以將任何方法作為控制器動(dòng)作來(lái)使用。
3. 理解控制器結(jié)果
控制器動(dòng)作返回一種叫做動(dòng)作結(jié)果(Action Result)的東西。動(dòng)作結(jié)果是控制器動(dòng)作返回給瀏覽器請(qǐng)求的東西。
ASP.NET MVC框架支持六種標(biāo)準(zhǔn)類(lèi)型的動(dòng)作結(jié)果:
ViewResult – 代表HTML及標(biāo)記。
EmptyResult – 代表無(wú)結(jié)果。
RedirectResult – 代表重定向到一個(gè)新的URL。
RedirectToRouteResult – 代表重定向到一個(gè)新的控制器動(dòng)作。
JsonResult – 代表一個(gè)JSON(Javascript Object Notation)結(jié)果,它可以用于AJAX應(yīng)用程序。
ContentResult – 代表著文本結(jié)果。
所有這些動(dòng)作結(jié)果都繼承自ActionResult基類(lèi)。
在大多數(shù)情況下,控制器動(dòng)作 ViewResult。例如,代碼清單2中的Index()控制器動(dòng)作返回了一個(gè)ViewResult。
代碼清單2 – BookController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class BookController : Controller { public ActionResult Index() { return View(); } } }
當(dāng)一個(gè)動(dòng)作返回一個(gè)ViewResult,將會(huì)向?yàn)g覽器返回HTML。代碼清單2中的Index()方法向?yàn)g覽器返回了一個(gè)名為Index.aspx的視圖。
注意到代碼清單2中的Index()動(dòng)作并沒(méi)有放回一個(gè)ViewResult()。而是調(diào)用了Controller基類(lèi)的View()方法。通常情況下,你并不直接返回一個(gè)動(dòng)作結(jié)果。而是調(diào)用Controller基類(lèi)的下列方法之一:
View – 返回一個(gè)ViewResult結(jié)果。
Redirect – 返回一個(gè)RedirectResult 動(dòng)作結(jié)果。
RedirectToAction – 返回一個(gè)RedirectToAction動(dòng)作結(jié)果。
RedirectToRoute – 返回一個(gè)RedirectToRoute動(dòng)作結(jié)果。
Json – 返回一個(gè)JsonResult動(dòng)作結(jié)果。
Content – 返回一個(gè)ContentResult動(dòng)作結(jié)果。
因此,如果你想向?yàn)g覽器返回一個(gè)視圖,你可以調(diào)用View()方法。如果你想要降用戶(hù)從一個(gè)控制器動(dòng)作重定向到另一個(gè),你可以調(diào)用RedirectToAction()方法。舉個(gè)例子,代碼清單3中的Details()動(dòng)作要么顯示一個(gè)視圖,要么將用戶(hù)重定向到Index()動(dòng)作,取決于Id參數(shù)是否含有值。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class CustomerController : Controller { public ActionResult Details(int? Id) { if (Id == null) return RedirectToAction("Index"); return View(); } public ActionResult Index() { return View(); } } }
ContentResult動(dòng)作結(jié)果很特別。你可以使用ContentResult動(dòng)作結(jié)果來(lái)將動(dòng)作結(jié)果作為純文本返回。舉個(gè)例子,代碼清單4中的Index()方法將消息作為了純文本返回,而不是HTML。
代碼清單4 – StatusController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class StatusController : Controller { public ContentResult Index() { return Content("Hello World!"); } } }
當(dāng)調(diào)用StatusController.Index()動(dòng)作時(shí),并沒(méi)有返回一個(gè)視圖。而是向?yàn)g覽器返回了原始的文本“Hello World!”。
如果一個(gè)控制器動(dòng)作返回了一個(gè)結(jié)果,而這個(gè)結(jié)果并非一個(gè)動(dòng)作結(jié)果 – 例如,一個(gè)日期或者整數(shù) – 那么結(jié)果將自動(dòng)被包裝在ContentResult中。舉個(gè)例子,當(dāng)調(diào)用代碼清單5中的WorkController的Index()動(dòng)作時(shí),日期將自動(dòng)作為一個(gè)ContentResult返回。
代碼清單5 – WorkerController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class WorkController : Controller { public DateTime Index() { return DateTime.Now; } } }
代碼清單5中的Index()動(dòng)作返回了一個(gè)DateTime對(duì)象。ASP.NET MVC框架自動(dòng)將DateTime對(duì)象轉(zhuǎn)換為一個(gè)字符串,并且將DateTime值包裝在一個(gè)ContentResult中。瀏覽器將會(huì)以純文本的方式收到日期和時(shí)間。
4. 總結(jié)
這篇教程的目的是為你介紹ASP.NET MVC中控制器、控制器動(dòng)作以及控制器動(dòng)作結(jié)果的概念。在第一部分,你學(xué)習(xí)了如何向ASP.NET MVC項(xiàng)目中添加新的控制器。接下來(lái),你學(xué)習(xí)了控制器的公共方法是如何作為控制器動(dòng)作暴露給全世界的。最后,我們討論了動(dòng)作結(jié)果的各種不同類(lèi)型,這些動(dòng)作結(jié)果可以從控制器動(dòng)作中返回。特別地,我們討論了如何從控制器動(dòng)作中返回一個(gè)ViewResult、RedirectToActionResult和ContentResult。
5. 創(chuàng)建控制器
這篇教程的目的是解釋如何來(lái)創(chuàng)建新的ASP.NET MVC控制器。你會(huì)學(xué)習(xí)如何通過(guò)Visual Studio Add Controller菜單和手工創(chuàng)建類(lèi)文件,來(lái)創(chuàng)建控制器。
5.1 使用Add Controler菜單選項(xiàng)
創(chuàng)建一個(gè)新控制的最簡(jiǎn)單方法是在Visual Studio的解決方案瀏覽器的Controllers文件夾上點(diǎn)擊右鍵,并且選擇Add,Controller菜單項(xiàng)(如圖1)。選擇這個(gè)菜單項(xiàng)打開(kāi)了Add Controller對(duì)話框(如圖2)。
圖2:添加一個(gè)新的控制器
注意到控制器名稱(chēng)的第一部分在Add Controller對(duì)話框中高亮顯示了。每一個(gè)控制器的名稱(chēng)必須以Controller后綴結(jié)尾。舉個(gè)例子,你可以創(chuàng)建一個(gè)叫做ProductController的控制器,但是不能創(chuàng)建一個(gè)叫做Product的控制器。
NOTE:如果你創(chuàng)建一個(gè)控制器,它不含有Controller后綴,那么你將無(wú)法調(diào)用這個(gè)控制器。不要這么做 -- 在犯了這個(gè)錯(cuò)誤之后,我已經(jīng)浪費(fèi)了不計(jì)其數(shù)的時(shí)間。
代碼清單1 - Controller/ProductController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; namespace MvcApplication1.Controllers { public class ProductController : Controller { // // GET: /Product/ public ActionResult Index() { return View(); } } }
你應(yīng)該總是在Controllers文件夾中創(chuàng)建控制器。否則的話,就破壞了ASP.NET MVC的慣例,其他的程序員將會(huì)花費(fèi)更多艱辛的時(shí)間來(lái)理解你的應(yīng)用程序。
5.2 創(chuàng)建動(dòng)作方法
當(dāng)你創(chuàng)建一個(gè)控制器時(shí),你可以選擇自動(dòng)生成Create,Update和Details動(dòng)作方法(如圖3)。如果你選擇了這個(gè)選項(xiàng),那么會(huì)生成代碼2中的控制器類(lèi)。
代碼清單2 - Controllers\CustomerController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Ajax; namespace MvcApplication1.Controllers { public class CustomerController : Controller { // // GET: /Customer/ public ActionResult Index() { return View(); } // // GET: /Customer/Details/5 public ActionResult Details(int id) { return View(); } // // GET: /Customer/Create public ActionResult Create() { return View(); } // // POST: /Customer/Create [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(FormCollection collection) { try { // TODO: Add insert logic here return RedirectToAction("Index"); } catch { return View(); } } // // GET: /Customer/Edit/5 public ActionResult Edit(int id) { return View(); } // // POST: /Customer/Edit/5 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int id, FormCollection collection) { try { // TODO: Add update logic here return RedirectToAction("Index"); } catch { return View(); } } } }
這些生成的方法都只是一些存根方法(stub methods)。你必須自己為客戶(hù)的創(chuàng)建、更新和顯示詳情添加實(shí)際的邏輯。但是,這些存根方法為你提供了一個(gè)漂亮的著手點(diǎn)。
5.3 創(chuàng)建一個(gè)控制器類(lèi)
ASP.NET MVC控制器不過(guò)是一個(gè)類(lèi)。如果你喜歡,可以無(wú)視Visual Studio便利的控制器創(chuàng)建方式,自己手動(dòng)來(lái)創(chuàng)建一個(gè)控制器類(lèi)。按照這些步驟:
右鍵點(diǎn)擊Controllers文件夾,并且選擇菜單項(xiàng)Add,New Item,然后選擇Class模板。
將新類(lèi)命名為PersonController.cs,然后點(diǎn)擊Add按鈕。
修改產(chǎn)生的類(lèi)文件,讓這個(gè)類(lèi)繼承自System.Web.Mvc.Controller基類(lèi)(見(jiàn)代碼清單3)。
代碼清單3 - Controllers\PersonController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Controllers { public class PersonController : System.Web.Mvc.Controller { public string Index() { return "Hello World!"; } } }
代碼清單3中的控制器類(lèi)公布了一個(gè)叫做Index()的動(dòng)作,它返回字符串“Hello World!”。你可以通過(guò)運(yùn)行應(yīng)用程序,并且請(qǐng)求像下面這樣的URL來(lái)調(diào)用這個(gè)控制器動(dòng)作:
localhost:40071/Person
NOTE:ASP.NET 開(kāi)發(fā)服務(wù)器使用一個(gè)隨機(jī)的端口號(hào)(例如,40071)。當(dāng)輸入U(xiǎn)RL來(lái)調(diào)用控制器時(shí),你需要提供正確的端口號(hào)。你可以通過(guò)將鼠標(biāo)懸停在ASP.NET開(kāi)發(fā)服務(wù)器的圖標(biāo)上來(lái)獲得端口號(hào),該圖標(biāo)位于Windows Notification Area(Windows通知區(qū)域,屏幕的右下角)。
6. 創(chuàng)建自定義動(dòng)作
本篇教程的目的是解釋如何創(chuàng)建一個(gè)新的控制器動(dòng)作。你會(huì)學(xué)習(xí)到控制器動(dòng)作的要求。你還會(huì)學(xué)習(xí)如何來(lái)阻止將方法公布為控制器動(dòng)作。
6.1 添加動(dòng)作到控制器
你可以通過(guò)在控制器中添加一個(gè)新的方法,將新的動(dòng)作添加到控制器中。舉個(gè)例子,代碼清單1中的控制器包含了一個(gè)叫做Index()和一個(gè)叫做SayHello()的動(dòng)作。這兩個(gè)方法都公布為了動(dòng)作。
代碼清單1 - Controllers\HomeController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApplication1.Controllers { [HandleError] public class HomeController : Controller { public ActionResult Index() { return View(); } public string SayHello() { return "Hello!"; } } }
為了將方法作為一個(gè)動(dòng)作公布給全世界,方法必須滿(mǎn)足特定的要求:
方法必須是公共的。
方法不能是靜態(tài)方法。
方法不能使擴(kuò)展方法。
方法不能是構(gòu)造函數(shù),訪問(wèn)器,或者設(shè)置器。
方法不能擁有開(kāi)放泛型類(lèi)型(open generic types)。
方法不能使控制器基類(lèi)中的方法。
方法不能含有ref或者out參數(shù)。
6.2 阻止公共方法被調(diào)用
如果你需要在控制器中創(chuàng)建一個(gè)公共方法,但是你不想將這個(gè)方法發(fā)布為控制器動(dòng)作,那么你可以通過(guò)使用[NonAction]特性來(lái)阻止該方法被外界調(diào)用。舉個(gè)例子,代碼清單2中的控制器含有一個(gè)叫做CompanySecrets()的公共方法,它使用[NonAction]特性進(jìn)行了修飾。
代碼清單2 - Controller\WorkController.cs
using System.Web.Mvc; namespace MvcApplication1.Controllers { public class WorkController : Controller { [NonAction] public string CompanySecrets() { return "This information is secret."; } } }
如果你試圖通過(guò)在瀏覽器地址欄輸入/Work/CompanySecrets來(lái)調(diào)用CompanySecrets()控制器動(dòng)作,那么你會(huì)獲得圖5所示的錯(cuò)誤消息:
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ASP.NET MVC中控制器的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!