ASP.NET MVC 5 Web編程3 -- Controller的應用及擴展


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

本文原始地址


免責聲明!

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



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