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視圖引擎。歡迎持續關注~