1、Controller類
i、Controller必須為公開類;
ii、必須以Controller結尾;
iii、繼承Controller基類或實現IController接口的類;
iv、類中必須包含數個返回值為ActionResult的公開方法,這些方法在MVC中稱為Action;
2、Controller執行過程:
當Controller被MvcHandler選中之后,下一步就是通過ActionInvoker選取適當的Action來執行,在Controller中,每一個Action可以定義零到多個參數,ActionInvoker會依據當前的RouteValue及客戶端傳來的信息准備可以輸入Action參數的數據,最后正式調用被Controller選中的那個Action方法【參數輸入的內容是通過模型綁定(Model Binding)機制從RequestContext屬性中獲取數據,並將數據對應或輸入到方法的參數中的。】Action執行完后的返回值通常是ActionResult類(其子類有ViewResult用於返回一個View、RedirectResult用於將網頁轉到其他地址、ContentResult用於返回一段文字內容、FileResult用於返回一個二進制文件),Controller得到ActionResult類之后,就會開始執行ActionResult類的ExecuteResult()方法,並將執行結果返回客戶端,這時Controller任務ok。
3、在Controller執行時還有一個動作過濾器(Action Filter)機制,分為4類:
授權過濾器(Authorization Filter)
動作過濾器(Action Filter)
結果過濾器(Result Filter)
例外過濾器(Exception Filter)
如果ActionInvoker找不到對應的Action可用,默認會執行System.Web.Mvc.Controller類的HandleUnknownAction()方法,在該類中,HandleUnknownAction方法默認會響應“HTTP404找不到資源”的錯誤信息。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace MvcDemo.Controllers
- {
- [HandleError]
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- ViewData["Message"] = "歡迎使用 ASP.NET MVC!";
- return View();
- }
- public ActionResult About()
- {
- return View();
- }
- }
- }
ViewData表示一個Dictionary對象,可以在View中讀取該對象被設定的數據(<%:ViewData["Message"] %>或使用<%=Html.Encode(ViewData["Message"] )%>)。
View()方法是來自於Controller基類里的一個輔助方法,返回ViewResult繼承ActionResult,如果沒有View中沒有參數,則返回此Action方法名的頁面View的第一個參數就是要傳給View使用的Model數據,其類型不能為string,否則會被當成視圖名稱來處理。
動作名稱選取器:
- public class HomeController:Controller{
- //要求的網址:http://localhost/Home/Index
- //返回的是/Views/Home/Index.aspx
- public ActionResult Index(){
- return view();
- }
- }
- public class HomeController:Controller{
- //要求的網址:http://localhost/Home/Default
- //返回的是/Views/Home/Default.aspx
- [ActionName("Default")]
- public ActionResult Index(){
- return view();
- }
- }
動作方法選取器
- [NonAction]
- public ActionResult Index(){
- reurn view();
- }
- private ActionResult Index(){
- reurn view();
- }
還有HttpGet、HttpPost、HttpDelete、HttpPut屬性,一根用於Action同名時,一個用來顯示,一個用來操作。由於HTML窗口無法送出“Delete”這個HTTP動詞,所以如果希望Action能提供像REST協議那樣的方式來處理刪除動作,又能通過同一個窗口使用這個只允許“Delete”的動作的話,可以使用Html.HttpMethodOverride()方法的HTML輔助方法來模擬HTTP DELETE方法的行為,但實際上窗口還是以HTTP POST的方式送出的。
ActionResult:
說明:
1)、在ViewResult中的參數指定頁面名稱和應用的主版頁面(MasterPage)名稱,而頁面的Page聲明中也包含了MasterPageFile屬性,則會以Action中的MasterPage為主。
2)、在PartialViewResult類中,功能與ViewResult類類似,但它無法為View賦值MasterPage,通常用在前端為Ajax應用程序的情況下,並可以通過Ajax來取得網頁中的部分內容。
3)、EmptyResult,有些Action在執行后其實不需要返回任何數據,例如一個頁面執行完成后直接轉到其他頁面,EmptyResult類不會執行任何響應客戶端的程序,所以也不會返回任何數據。
4)、ContentResult類可以響應文字內容的結果,並且可以響應任意指定文字內容、Content-Type和文字編碼。
- public ActionResult Content(){
- string strHTML="";
- return Content(strHTML);
- }
- 或
- public string Content(){
- string strHTML="";
- retrun strHTML;
- }
- //說明,在MVC中只要Action返回的不是ActionResult,就會將返回的類轉換成字符串輸出;
5)、FileResult,可以響應任意的文件內容,包括二進制格式的數據,例如圖像文件、PDF文檔、zip文件,你可以輸入byte數組、文件路徑、Stream數據、Content-Type、下載文件名等參數並將返回客戶端。其三個子類:
FilePathResult:響應一個實體文件
FileContentResult:響應一個byte數組的內容
FileStreamResult:響應一個Stream數據
- public ActionResult GetFile(){
- byte[] fileContent = GetFileByteArrayFromDB();
- return File(fileContent,"application/pdf","YourReport.pdf");
- }
當為中文名時需要Server.UrlPathEncode()方法進行編碼
6)、JavaScriptResult類的用途是將JavaScript程序代碼響應給瀏覽器,
7)、JsonResult類可以自動將任意對象的數據序列轉換成JSON格式返回,JsonResult類使用JavaScriptSerializer實例完成JSON序列化的操作,但如果你的對象無法序列化,這個過程就會發生意外,在使用JsonResult從MVC2.0開始為了避免JSON Hijacking攻擊,設置在默認的情況下,任何以JsonResult類返回的請求都不允許GET方法從中獲取任何JSON數據。
如果一HTTPPOST方法取得的內容應該會是:{"id":1,"name":"will"}但是使用HTTPGET則獲取不到,並且報錯,但是如果單純只使用Get方法則數據無法被瀏覽器緩存,所以可以通過以下方式讓get方式可以獲取Json數據
- public ActionResult JSON(){
- return Json(new {id=1;name="will"},JsonRequestBehavior.AllowGet);
- }
8)、RedirectResult主要用途是執行指向其他頁面的重定向
9)、RedirectToRoute,
a、輔助方法RedirectToAction
轉到同一個Controller中的另一個Action
轉到指定Controller的指定Action中
轉到MemberController的List Action,並且加上page這個RouteValue值
- public ActionResult REdirectToActionSample(){
- return RedirectToAction("List","Member",new {page=3});
- }
b、輔助方法RedirectToRoute
轉到同一個Controller中的另一個Action
- public ActionResult REdirectToActionSample(){
- return RedirectToRoute(new {action ="SamplePage"});
- }
轉到指定Controller的指定Action中
- public ActionResult REdirectToActionSample(){
- return RedirectToRoute(new {controller="Member",action="List"});
- }
轉到MemberController的List Action,並且加上page這個RouteValue值
- public ActionResult REdirectToActionSample(){
- return RedirectToRoute(new {controller="Member",action="List",page=3});
- }
類 型 |
使用時機 |
接 口 |
實現方法 |
授權過濾器(Authorization Filter) |
在執行任何Filter或Action之前被執行,用於進行身份驗證; |
IauthorizationFilter |
AuthorizeAttribute |
動作過濾器 (Action Filter) |
在執行Action之前或之后被執行,用於執行的Action需要生成記錄或者緩存數據時; |
IActionFilter |
ActionFilterAttribute |
結果過濾器 (Result Filter) |
在執行ActionResult的前后被執行,在View被顯示到瀏覽器之前可以執行一些邏輯運算,或修改ViewResult的輸出結果; |
IResultFilter |
ActionFilterAttribute |
異常過濾器(Exception Filter) |
在Action執行之前后之后或者Result執行之前或之后被執行。在執行中發生異常時,可以使用此Filter指向其他頁面來顯示錯誤信息 |
IExceptionFilter |
IExceptionFilter |
1、動作過濾器一律使用屬性Attribute的方式應用在Action之上,如可以設置只有此人可以調用此Action
動作過濾器可以應用在Action上,也可以應用在Controller上。動作過濾器提供了兩個事件在Action的前后執行,分別是OnActionExecuting與OnActionExecuted。如果屬性類要實現IActionFilter接口,就會被要求必須實現這兩個方法。
AsyncTimeout屬性可讓你設定異步控制器的逾時毫秒數,
NoAsyncTimeout設置Action的執行是否可以有逾期時間
2、授權過濾器,
在web.config文件的system.web類的設定中有一個Authentication設定,其中的forms部分有一個LoginUrl屬性可設定當權限不足時應該轉向的地址
- <Authentication mode="Forms">
- <forms loginUrl="~/account/Logon" timeout="2880"/>
- </Authentication>
其他屬性:
ChildActionOnly,通過ReaderAction()方法執行的Action不被其他HTTP GET方法或HTTP POST方法執行的話,就可以使用此屬性
RequireHttps,可以讓此Action僅能顯示在HTTPs安全登錄的狀態下,如果客戶端使用HTTP連接,該Action會自動轉向同一個Action的HTTPs地址。如果使用HTTP POST方法發布應用RequestHttps屬性的頁面,將會引發InvalidOperationException異常。
ValidateInput,.NET框架默認會驗證所有通過窗口傳入的數據,並檢查其中是否含有惡意的標簽或程序代碼,當需要通過網頁輸入HTML標簽時,就必須手動關閉此驗證。在Forms程序時,可以在web.config文件中"<page validateRequest="false">"以關閉全站的輸入驗證機制。也可以在頁面的最上方設定"ValidateRequest='false'"來實現此功能。但是在MVC中這兩種方式都沒有作用,而是要在Action上通過設定ValidateInput屬性來關閉輸入驗證機制。
ValidateAntiForgeryToken,驗證來源是否為相同網站。
3、結果過濾器
提供的兩個事件會在執行視圖的前后執行,這兩個事件分別是OnResultExcuting與OnResultExcute,如果屬性類要實現IResultFilter接口,就會被要求必須實現這兩個方法。
OutputCache是實現輸出緩存機制。
4、異常過濾器
異常過濾提供了一個事件,會在執行完Action與ActionResult之后才執行,在實現IExceptionFilter接口后,必須實現OnException方法才能使用該接口。異常過濾器內置了一個HandlerError屬性。用來處理MVC執行過程中發生的異常。