ASP.NET MVC 5 Web程式設計3 -- Controller的應用及擴充套件

杭偉發表於2015-03-31

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

本文原始地址

相關文章