mvc Controller類介紹


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找不到資源”的錯誤信息。

 

C#代碼 復制代碼 收藏代碼
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. namespace MvcDemo.Controllers
  7. {
  8. [HandleError]
  9. public class HomeController : Controller
  10. {
  11. public ActionResult Index()
  12. {
  13. ViewData["Message"] = "歡迎使用 ASP.NET MVC!";
  14. return View();
  15. }
  16. public ActionResult About()
  17. {
  18. return View();
  19. }
  20. }
  21. }
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,否則會被當成視圖名稱來處理。

 

動作名稱選取器:

C#代碼 復制代碼 收藏代碼
  1. public class HomeController:Controller{
  2. //要求的網址:http://localhost/Home/Index
  3. //返回的是/Views/Home/Index.aspx
  4. public ActionResult Index(){
  5. return view();
  6. }
  7. }
  8. public class HomeController:Controller{
  9. //要求的網址:http://localhost/Home/Default
  10. //返回的是/Views/Home/Default.aspx
  11. [ActionName("Default")]
  12. public ActionResult Index(){
  13. return view();
  14. }
  15. }
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();
	}
}

 

動作方法選取器

C#代碼 復制代碼 收藏代碼
  1. [NonAction]
  2. public ActionResult Index(){
  3. reurn view();
  4. }
  5. private ActionResult Index(){
  6. reurn view();
  7. }
[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類不會執行任何響應客戶端的程序,所以也不會返回任何數據。

C#代碼 復制代碼 收藏代碼
  1. public ActionResult Empty(){
  2. return new EmptyResutl();
  3. }
  4. public viod Empty(){
  5. return;
  6. }
public ActionResult Empty(){
	return new EmptyResutl();
}
或
public viod Empty(){
	return;
}

 

4)、ContentResult類可以響應文字內容的結果,並且可以響應任意指定文字內容、Content-Type和文字編碼。

C#代碼 復制代碼 收藏代碼
  1. public ActionResult Content(){
  2. string strHTML="";
  3. return Content(strHTML);
  4. }
  5. public string Content(){
  6. string strHTML="";
  7. retrun strHTML;
  8. }
  9. //說明,在MVC中只要Action返回的不是ActionResult,就會將返回的類轉換成字符串輸出;
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數據

C#代碼 復制代碼 收藏代碼
  1. public ActionResult GetFile(){
  2. byte[] fileContent = GetFileByteArrayFromDB();
  3. return File(fileContent,"application/pdf","YourReport.pdf");
  4. }
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數據。

C#代碼 復制代碼 收藏代碼
  1. public ActionResult JSON(){
  2. return Json(new {id=1;name="will"});
  3. }
public ActionResult JSON(){
	return Json(new {id=1;name="will"});
}

如果一HTTPPOST方法取得的內容應該會是:{"id":1,"name":"will"}但是使用HTTPGET則獲取不到,並且報錯,但是如果單純只使用Get方法則數據無法被瀏覽器緩存,所以可以通過以下方式讓get方式可以獲取Json數據

C#代碼 復制代碼 收藏代碼
  1. public ActionResult JSON(){
  2. return Json(new {id=1;name="will"},JsonRequestBehavior.AllowGet);
  3. }
public ActionResult JSON(){
	return Json(new {id=1;name="will"},JsonRequestBehavior.AllowGet);
}

8)、RedirectResult主要用途是執行指向其他頁面的重定向

 

9)、RedirectToRoute,

a、輔助方法RedirectToAction

轉到同一個Controller中的另一個Action

C#代碼 復制代碼 收藏代碼
  1. public ActionResult REdirectToActionSample(){
  2. return RedirectToAction("SamplePage");
  3. }
public ActionResult REdirectToActionSample(){
		return RedirectToAction("SamplePage");
	}

 

轉到指定Controller的指定Action中

C#代碼 復制代碼 收藏代碼
  1. public ActionResult REdirectToActionSample(){
  2. return RedirectToAction("List","Member");
  3. }
public ActionResult REdirectToActionSample(){
		return RedirectToAction("List","Member");
	}

 

轉到MemberController的List Action,並且加上page這個RouteValue值

C#代碼 復制代碼 收藏代碼
  1. public ActionResult REdirectToActionSample(){
  2. return RedirectToAction("List","Member",new {page=3});
  3. }
public ActionResult REdirectToActionSample(){
		return RedirectToAction("List","Member",new {page=3});
	}

 

b、輔助方法RedirectToRoute

轉到同一個Controller中的另一個Action

C#代碼 復制代碼 收藏代碼
  1. public ActionResult REdirectToActionSample(){
  2. return RedirectToRoute(new {action ="SamplePage"});
  3. }
public ActionResult REdirectToActionSample(){
		return RedirectToRoute(new {action ="SamplePage"});
	}

 

轉到指定Controller的指定Action中

C#代碼 復制代碼 收藏代碼
  1. public ActionResult REdirectToActionSample(){
  2. return RedirectToRoute(new {controller="Member",action="List"});
  3. }
public ActionResult REdirectToActionSample(){
		return RedirectToRoute(new {controller="Member",action="List"});
	}

 

轉到MemberController的List Action,並且加上page這個RouteValue值

C#代碼 復制代碼 收藏代碼
  1. public ActionResult REdirectToActionSample(){
  2. return RedirectToRoute(new {controller="Member",action="List",page=3});
  3. }
public ActionResult REdirectToActionSample(){
		return RedirectToRoute(new {controller="Member",action="List",page=3});
	}

 

ViewData與TempData:

 

在Action中利用ControllerBase類中的ViewData屬性存儲臨時數據,好讓這些數據能在View中被使用。

ViewData屬性是一個ViewDatDictionary類,可用於存儲任意對象的數據,但存儲的鍵值必須為字符串

ViewData有一個特性,就是它只會存在與當前的HTTP請求中,而不像Session一樣可以將數據帶到下一個HTTP請求

 

TempData:

其數據結構與ViewData一樣,都屬於字典類

他的內部是用Sessioin來存儲數據的,並且他的數據存儲的時間為“1次網頁請求”

 

MVC1中當TempData在Action中被設定后,默認一定會保留至下一個網頁請求,且要在持續的Action中被執行並讀取后,該TempData才會被清除。

Mvc2中只有在將RedirectResult類或RedirectToRouteResult類當成ActionResult時,才會強制保留TempData,除此之外,只要存在參考TempData的鍵值,默認就會在當次頁面請求中將TempData清除。但如果只設定了TempData的值而沒有讀取的行為,TempData還是會保留到下一個頁面中執行。

 

 

過濾器:

使用時機

實現方法

授權過濾器(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

C#代碼 復制代碼 收藏代碼
  1. [Attribute(Roles="Admin")]
  2. public ActionResult Edit(){}
[Attribute(Roles="Admin")]
public ActionResult Edit(){}

 

動作過濾器可以應用在Action上,也可以應用在Controller上。動作過濾器提供了兩個事件在Action的前后執行,分別是OnActionExecuting與OnActionExecuted。如果屬性類要實現IActionFilter接口,就會被要求必須實現這兩個方法。

AsyncTimeout屬性可讓你設定異步控制器的逾時毫秒數,

NoAsyncTimeout設置Action的執行是否可以有逾期時間

 

 

2、授權過濾器,

C#代碼 復制代碼 收藏代碼
  1. [Authorize(Roles="Admin")]
  2. public ActionResult Edit(){}
[Authorize(Roles="Admin")]
public ActionResult Edit(){}

 

在web.config文件的system.web類的設定中有一個Authentication設定,其中的forms部分有一個LoginUrl屬性可設定當權限不足時應該轉向的地址

Xml代碼 復制代碼 收藏代碼
  1. <Authentication mode="Forms">
  2. <forms loginUrl="~/account/Logon" timeout="2880"/>
  3. </Authentication>
<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執行過程中發生的異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM