2010-01-12 73 views
5

我有一個ActionFilter,我在ASP.NET MVC 2中運行OnActionExecuting。本質上,我希望actionfilter清理我的數據並替換當前模型(將傳遞給後續操作過濾器和也是我的行動方法)與消毒模型。這是可能的,這是一個壞主意 - 如果是的話,爲什麼?在ActionFilter中修改模型

謝謝你在前進, JP

+0

味道不好設計。 – 2010-01-13 08:21:45

+7

菲利普,如果你要批評那麼請建設性。告訴我爲什麼這是不好的設計,告訴我你看到什麼好的替代品...否則你的評論是沒用的,我和任何其他人閱讀這篇文章... – 2010-01-13 16:45:35

回答

5

如果您需要處理您的模型,你可能會被單個控制器的範圍內處理更多的(除非你所有的控制器使用相同的模型類型?)。另一種方法是覆蓋控制器本身的方法OnActionExecuting()OnActionExecuted()。這使您可以將業務邏輯保持在控制器範圍內。

通常ActionFilters用於橫切關注點 - 您希望爲許多操作方法運行某些操作方法,而不管它們在應用程序中的存在位置。因此,除非您的模型消毒邏輯適用於許多控制器和操作,或者是非常通用的(也許它是,在這種情況下,您的方法可能是好的),您可能希望將其從過濾器中引入控制器。如果它可以廣泛應用,那麼ActionFilter就可以。

+0

我絕對看到你的觀點,但消毒是非常多的CCC和將用於控制器和操作方法。 – 2010-01-13 01:54:42

6

下面是MVC V1,我希望這不是在V2改變:

var view = filterContext.Result as ViewResultBase; 
if (view != null) 
    view.ViewData.Model ... 

我不明白你爲什麼要做到這一點在OnActionExecuting,但如果你必須,這樣做在那裏,並設置一些標誌(私人領域),OnActionExecuted必須調整結果模型。但是,無論如何,您必須使用後者,除非分配了.Result - 在這種情況下,您的操作根本不會被調用,並且將使用分配的結果。

+0

我正在嘗試訪問模型OnActionExecuting(即執行動作之前),所以在這種情況下,模型將始終返回空... – 2010-01-13 01:53:36

+0

我應該更加明確 - 我想(必須)做它OnActionExecuting的原因是所以我仍然可以觸發ValidateInput過濾器(並且不必關閉它!)。如果我的屬性包含HTML,那麼它們將被標記爲危險,並且過濾器將失敗(因爲想要更好的術語)。數據需要在點擊第二個過濾器之前更新,因此OnActionExecuted太晚了... – 2010-01-13 17:49:59

2

順便說一句,對於MVC 3 & 4:

filterContext.Controller.ViewData.Model