2017-06-02 72 views
0

在某些情況下,我希望執行一條規則,阻止我的團隊的開發人員在他們的剃刀視圖中指定任何@Layout。在我們的一些觀點中佈局將是一個常數,所以我不希望我的團隊成員必須正確設置它,甚至不需要設置它。檢測佈局是否已在視圖中指定?

爲此,我將創建一個操作篩選器,並檢測ViewResult.MasterName是否爲空/空,然後通過深入的錯誤消息引發異常。我已經嘗試過ActionExecuting,ActionExecuted,ResultExecuted操作過濾器,但是在所有情況下,即使在視圖中指定.MasterName屬性也始終爲空。是否不可能在動作過濾器中檢測到它,因爲它稍後在管道中?如果在動作過濾器中不可用,是否還有其他機制可以用來檢測並阻止它?

回答

0

MasterName屬性設置在ViewResult類中,因此在例如ActionFilter將覆蓋無論是在Razor視圖通過@Layout規定:

public class LayoutFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      result.MasterName = "~/Views/Shared/_MyLayout.cshtml"; 
     } 
    } 
} 

我不認爲會有直接防止@Layout在Razor視圖被設置的方式,但即使有人沒有在視圖中設置@Layout ,它仍然會被覆蓋使用上述。您仍然可以通過[LayoutFilter]屬性有選擇地應用適用的控制器/操作。

另一種方式來設置所需的佈局在RouteConfig,然後每答案hereoverride ViewResult爲:

不管怎樣,希望它幫助。