2009-06-01 111 views
5

I asked a question今天早些時候在ASP.Net MVC中約ActionFilters。原來我的問題是我的ActionFilter甚至沒有運行。除此之外,我讀this article,我找不到他所做的任何事情。爲什麼我的ActionFilters沒有運行?

這是我的代碼:

// The ActionFilter itself 
public class TestingIfItWorksAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.TempData["filter"] = "it worked!"; 
     base.OnActionExecuting(filterContext); 
    } 
} 

// The Controller Action with the filter applied 
[TestingIfItWorks] 
public ActionResult Test() 
{ 
    var didit = TempData["filter"]; 
    return View(); 
} 

在過濾方法,當我調試時從不打一個斷點,TempData["filter"]持有視圖時呈現的null值。

爲什麼這不起作用?

回答

4

根據您的意見,以另一種答案

當通過單元測試進行測試時,過濾器不會被調用。如果你想調用過濾器,那麼你需要模仿ControllerActionInvoker。最好是單獨測試過濾器本身,然後使用反射來確保將過濾器應用於具有正確屬性的操作。我更喜歡這種機制,以結合測試過濾器和操作。

原始

當然,你在你的方法需要一個override否則你實際上並沒有取代基類的方法。我本來期待編譯器抱怨你需要一個newoverride就可以了。如果您不包含override關鍵字,則其行爲與您使用new時相同。由於框架將其作爲ActionFilterAttribute調用,這意味着您的方法永遠不會被調用。

MSDN報價:

如果在派生類中的方法是 沒有新的前面或覆蓋 關鍵字,編譯器會發出 警告,該方法將表現爲 如果新的關鍵字在場。

+0

嗯......奇怪,它沒有進入那裏。我沒有得到警告(直到我重新編譯),但包括覆蓋並沒有改變情況:代碼仍然沒有運行。 – 2009-06-01 13:54:13

+0

你有做重建解決方案嗎?也許一個圖書館已經過時了。如果您使用覆蓋,我無法想象這不起作用。 – tvanfosson 2009-06-01 14:00:03

0

除了什麼tvanofosson說,你的動作方法實際上並沒有渲染任何東西的視圖。您的觀點是否有<%=TempData["Filter"].ToString()%>聲明或類似的聲明?

4

在情況下,它是有幫助的使用MVC 4/5的人:如果你得到你的ActionFilterAttributeIActionFilter錯誤的命名空間

ActionFilters不運行:https://stackoverflow.com/a/13710468/188926

使用System.Web.Http.Filters的Web API,標準MVC操作的System.Web.Mvc

正如在問題中,如果您弄錯了過濾器屬性,它將被忽略(無錯誤),這使得它很難診斷。