天天看點

艾偉:[一步一步MVC]第一回:使用ActionSelector控制Action的選擇

<a href="http://kb.cnblogs.com/page/46626">[一步一步MVC]第一回:使用ActionSelector控制Action的選擇</a>

<a href="http://kb.cnblogs.com/page/53772">[一步一步MVC]第二回:還是ActionFilter,實作對業務邏輯的統一Authorize處理</a>

<a href="http://kb.cnblogs.com/page/54818">[一步一步MVC]第三回:MVC範例大觀園</a>

<a href="http://kb.cnblogs.com/page/54820">[一步一步MVC]第四回:漫談ActionLink,有時“胡攪蠻纏”</a>

<a href="http://kb.cnblogs.com/page/54823">[一步一步MVC]第五回:讓TagBuilder豐富你的HtmlHelper</a>

<a href="http://kb.cnblogs.com/page/54825">[一步一步MVC]第六回:什麼是MVC(上)?</a>

ActionFilter一定是MVC控制中對于Action控制中最值得研究的玩意,在項目實際中我們不可避免的使用例如:

HandleError

Authorized

OutputCache

在本文中,我們應用Action Selector方式進行Action的選擇,想要闡述清楚這個問題,我們從實際的問題出發來關注。

OnlyInRole需要自己寫,不過就幾行話

根據老趙的指導,我對此思路進行了必要的探讨,感受果然不同凡響,很好很暴力。

為了實作對于Action進行Selector的具體實作,我選擇對ActionNameSelectorAttribute 進行擴充,參考ActionName的實作方式,對于按照RoleType進行過濾的需求顯然有很好的借鑒價值,以ActionNameAttribute為例,其具體實作為:

再來了解ActionNameSelectorAttribute抽象類的定義,其主要提供了對Action進行Select時的IsValidName判斷約定,例如ActionNameSelectorAttribute的定義:

是以,對ActionNameSelecterAttribute進行擴充變得異常簡單,下面是一個最簡單的實作,肯定讓我們耳目一新:

我們的邏輯其實很簡單,借助于IPrincipal的IsInRole方法,可以很簡單的根據role的定義進行IsValidName過濾,例如我們的應該可以就是:

不過,在應用上還有一些值得注意的問題:

使用非泛型ActionLink方法調用應用ActionInRole 的Action

一般而言,我們提倡應用強類型ModelData在View層進行操作,那麼泛型方法ActionLink值得推薦,

然而,應用被ActionInRole标記的,同時被ActionName重命名的Action,将不被識别,我們隻好以非泛型方式實作對于一名多用的Action來調用:

在return View中通過制定ViewName進行傳回,來選擇适合的View,例如

因為預設情況下,MVC引擎是以ActionName進行傳回的,在我們的應用中必須以這種方式進行。

本文着重于應用,而沒有特别對什麼是ActionFilter進行探讨,我們在合适的時間再次與MVC握手,對此進行進一步進行讨論。