2015-05-18 31 views
2

我的ActionFilter的調用順序有問題。ActionFilterAttribute作用域調用訂單

我創建了設置佈局MasterName的篩選:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)] 
public class MasterNameAttribute : ActionFilterAttribute 
{ 
    public String MasterName { get; set; } 

    public MasterNameAttribute(String masterName) 
    { 
     this.MasterName = masterName; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     viewResult.MasterName = this.MasterName; 

我用它在我的控制器是這樣的:

[MasterName("_Layout_Main")] 
public partial class ProjectController : BaseController 
{   
    [MasterName("_Layout_Special")] 
    public ActionResult Dashboard() 
    { 

無我有一個ASP MVC被調用過濾器問題按順序動作範圍 - >方法範圍。但是我希望Method-Scope過濾器是結果並覆蓋Controller-Scope過濾器。

我的問題:

  1. 在MSDN被寫入,所述過濾器處於 「AttributeTargets」 枚舉(類= 4,方法= 0x40的)的枚舉值順序呼叫。爲什麼Controller-Scope過濾器是最後一個被調用的?
  2. 如何在不使用「訂單」屬性的情況下解決訂單問題? 是檢測samt類型的Methode-Scope過濾器是否存在的正確方法?

提示

.ControllerDescriptor.IsDefined(... 

不幫我,因爲我真正的實現有一定的條件,如果MasterName由過濾器或不設置好的。因此,找到方法範圍屬性不會告訴我該過濾器是否已被使用以及是否應該使用控制器範圍過濾器(只有在未使用方法範圍過濾器的情況下)。所以我認爲一個正確的電話訂單是最好的解決方案。

相關的@swapneel的answere:

沒有抱歉,這不符合我的需求。我有一個非常複雜的佈局選擇,最好由屬性設置。我需要繼承,覆蓋和訂單邏輯。

像:

[MasterName("_Layout1", Host = "sub1.domain.com")] 
[MasterName("_Layout2", Host = "sub2.domain.com")] 
[MasterName("_Layout3", Host = "sub3.domain.com")] 
public partial class ProjectController : BaseController 
{ 
    [MasterName("_Layout_1_1", Host = "sub1.domain.com")] 
    [MasterName("_Layout_2_1", Host = "sub2.domain.com")] 
    public ActionResult Dashboard() 
    { 

這裏一個 「儀表盤」 行動電話與主持人 「sub2.domain.com」 應該覆蓋定義控制器 「_Layout2」 MasterName與 「_Layout2_1」。在所有其他操作中,它不會被覆蓋,「_Layout2」是活動的。

Regards Steffen!

回答

0

這可能不是-關係與你的問題,但我認爲

如果你想設置一個或不同的母版頁上運行 時間或設計時間每個視圖。您可以使用_ViewStart.cshtml.


的_ViewStart.cshtml文件將在每個視圖的渲染開始執行。該文件中的代碼塊中包含的任何代碼將在視圖中的任何代碼之前執行。通常情況下,這個文件將設置佈局模板使用通過在應用程序中訪問量:

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

MVC應用程序中可以有多個_ViewStart.cshtml文件。這些文件執行的順序取決於文件夾層次結構中的文件位置以及正在呈現的特定視圖。 MVC運行時將首先執行位於Views文件夾根目錄中的_ViewStart.cshtml文件中的代碼。然後,它將沿着文件夾層次結構前進,執行沿途發現的每個_ViewStart.cshtml文件中的代碼。舉例來說,如果我們在以下位置_ViewStart.cshtml文件:

從上面這個鏈接複製文字 - what-is-the-purpose-of-the-viewstartcshtml-file-and-how-is-it-used

+0

沒有抱歉,這是沒有幫助,請參閱擴展最初的問題以獲取更多信息。 –