Controller基礎
一. 訪問修飾符
1.1 類的訪問修飾符
Controller類的訪問修飾符必須是public,url才能被攔截。
internal能編譯通過,但無法攔截url請求。private、protected、protected internal不能通過編譯。
1.2 方法的訪問修飾符
Controller中方法的訪問修飾符必須是public,url才能被攔截。其它型別的訪問修飾符會使該方法無法攔截url請求。
二. 特性
可使用的特性有很多,這裡只描述常用的一些特性,同樣,類和方法的可使用特性分別描述。
2.1 類可使用特性
2.1.1 Authorize特性(System.Web.Mvc.AuthorizeAttribute)
當然,通常的用法不是直接在Controller上標記這個特性,而是標記自定義特性(繼承自AuthorizeAttribute)。通過擴充套件AuthorizeAttribute,實現許可權控制。可以稱它為“許可權特性”吧。關於Authorize特性,後面會寫一篇文章講述MVC裡的許可權控制實現。
2.1.2 AllowAnonymous特性(System.Web.Mvc.AllowAnonymousAttribute)
與Authorize特性相對應,表示跳過驗證(如果你使用自定義Authorize特性做許可權控制的話)。
2.1.3 HandleError特性(System.Web.Mvc.HandleErrorAttribute)
這個特性的含義跟它的名字一樣,是用來處理異常資訊的。上面的特性標記表示:當UserInfoController類中丟擲異常時,MVC將預設顯示Error檢視(~/Views/Shared目錄下)。同樣,你可以擴充套件HandleError特性,實現日誌記錄,出錯友好提示等功能。
2.1.4 ValidateAntiForgeryToken特性(System.Web.Mvc.ValidateAntiForgeryTokenAttribute)
此特性用於阻止CSRF(跨站請求偽造)攻擊。現在沒有證據表明這個特性一定對CSRF攻擊有效,本人在此保留意見。
如果以上MVC類使用特性沒有列舉出您經常使用的特性之一,還請不吝賜教,留言給我。在此感謝~
2.2 方法可使用特性
2.2.1 ActionName特性(System.Web.Mvc.ActionNameAttribute)
此特性用於指定Action的名稱。如上圖例,被此特性標記後,url攔截的action名稱將是Default,而不是Index。如果你使用View()來返回頁面,則MVC會尋找Default.cshtml,而不是Index.cshtml。如果你想指定View,則要使用View("viewName")這樣的方法。
2.2.2 NonAction特性(System.Web.Mvc.NonActionAttribute)
此特性用於標記Action無效,被標記的Action將無法攔截url請求(普通方法)。將訪問修飾符換成private也可以實現類似效果。
2.2.3 HttpGet,HttpPost,HttpDelete,HttpPut特性(System.Web.Mvc.xxxAttribute...)
限制操作方法僅處理對應的Http請求。
2.2.4 Bind特性(System.Web.Mvc.BindAttribute)
此特性用於限制繫結欄位,Bind特性的引數有三個:Prefix字首,Include包含,Exclude排除。
三. Action的引數和返回值
3.1 引數
比如常用資訊列表的編輯功能的Action,程式碼如下:
public ActionResult Edit(string id = "") { UserInfoViewModel model = CoreDBContext.GetModelByID(id); return View("Detail",model); }
前端呼叫程式碼(Razor檢視引擎):
@Html.ActionLink("編輯", "Edit", "UserInfo", new { id=item.UserID.ToString() },null)
如果Edit方法(Action)的引數有多個,而前端傳值只傳遞了一個,那麼Action接收值的是第一個引數,如果引數型別不匹配,則會報錯。
3.2 返回值
如3.1中的Edit方法,返回值型別是ActionResult,而程式碼返回的是View檢視,即ViewResult。因為ViewResult的最終父類也是ActionResult,所以這樣並沒有問題。這裡返回的View檢視即Detail.cshtml,是一個Razor引擎渲染的頁面檔案。
實際應用中,Action返回值不一定是ActionResult,可以是json,可以是自定義html字串,也可以返回型別為空,然後使用RedirectToAction方法轉到另一個Action中繼續處理。
Controller擴充套件
BaseController ? BusinessController<B, T> ?
一般來說,我們會在MVC專案中使用泛型+虛方法,抽取出通用操作,讓具體的業務類繼承這些基型別,達到程式碼的簡化。典型的,實體類的增刪改查,可以被抽取出來。
public class BusinessController<B,T> : BaseController where B : class where T : class,new() { public virtual ActionResult Index() { return View(); } public virtual ActionResult Insert(T info) { if (info != null) { //result = baseBLL.Insert(info); } return Content(string.Empty); } }
具體業務類
public class UserController : BusinessController<UserBLL, UserInfoViewModel> { //... }
這樣的機制在WebForms中是標準的設計結構。對於軟體架構,關於"型別"的設計思想,永遠是通用的。
非同步Controller
非同步Controller需要Controller繼承AsyncController類(System.Web.Mvc.AsyncController)
public class TimeController : AsyncController { //... }
由於時間倉促,這裡不對非同步Controller做深究。非同步操作本身是個大話題,這裡只想讓大家有一個概念性的認識。
總結
本章的內容很簡單,對Controller類本身的訪問限制及可使用特性做了概括性總結,對Controller在專案中的設計提出了一種方案,同時簡要提及了非同步Controller。
在下一章中,將重點介紹Razor檢視引擎。歡迎持續關注~