2011-07-18 102 views
12

我有以下簽名用asp.net mvc的動作奇怪的行爲過濾AttributeUsage

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class UnitOfWorkAttribute : ActionFilterAttribute 

根據MSDN的行爲過濾器:

該物業的AllowMultiple指示是否的 你的屬性的多個實例可以存在於一個元素上。如果設置爲true,則允許多個 實例;如果設置爲false(默認值),則只允許有一個 實例。

在MVC中,行爲似乎有點奇怪。當我用這個屬性修飾動作時,我發現過濾器的OnActionExecuting方法執行了兩次。

該過濾器僅在操作上聲明,而不是在控制器上聲明,並且我清除了任何全局過濾器。有人可以解釋這種行爲嗎?

+0

只是_AllowMultiple_這會導致_OnActionExecuting_被調用兩次,或者你真的用兩個屬性實例來修飾你的動作嗎? – Codo

+0

@Codo,不,我不需要多個實例,因此將AllowMultiple設置爲false可以解決問題,但它不能解釋它。可能是asp.net mvc中的錯誤? –

+0

這個動作確實沒有發射兩次?只有屬性? – dknaack

回答

29

我遇到了同樣的問題。 (我安裝了一個全球性的過濾器(只有一次),並發現其IActionFilterIResultFilter方法被調用兩次,每次請求。在傳遞給這些方法的filterContext.HttpContext對象正是爲這兩個調用相同)。

這橫空出世這是由於在視圖中使用Html.Action所致。它看起來(從查看調用堆棧)調用Html.Action reentrantly處理子操作方法(在處理初始操作方法期間)並且爲兩者調用過濾器。

您可以通過檢查filterContext.IsChildAction屬性來檢測此情況。

+0

您節省了我的一天:-) –

+0

非常感謝soo!正是我需要的。 – Vindberg

+0

這很有用,但它爲什麼這樣做。我回想起所有使用自定義操作過濾器的應用程序,並且很擔心。 –

0

我從我的自定義操作篩選器類執行了兩次也有OnActionExecuting方法。

在某一點上我在的global.asax.cs文件添加到了我的Application_Start方法:

GlobalConfiguration.Configuration.Filters.Add(new MyCustomActionFilter()); 

很顯然,我的行爲過濾器已經加入到Filters收集這是導致雙呼叫OnActionExecutingOnActionExecuted。因此applicaton_start中的那一行是不需要的。