2016-10-05 30 views
9

我想在我的應用程序中使用2個獨立的佈局。假設一個用於網站的公開部分,另一個則由於我們需要的某些原因而爲空。如何在ASP.NET Core MVC中指定不同的佈局

核心之前,我可以做這個定義過濾器:

public class LayoutInjecterAttribute : ActionFilterAttribute 
{ 
    private readonly string _masterName; 
    public LayoutInjecterAttribute(string masterName) 
    { 
     _masterName = masterName; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      result.MasterName = _masterName; 
     } 
    } 

}

現在的ViewResult沒有MasterName財產。是否可以現在做,而不是在查看佈局定義中使用。

日Thnx

回答

8

這是我如何在我的ASP.NET MVC的核心應用程序中使用多個佈局。

你可以嘗試像這個 -

_ViewStart.cshtml指定喜歡這個 -

@{ 
    Layout = "_Layout"; 
} 

默認_layout如果你想設置頁面特定佈局然後在page.cshtml,您可以指定其他視圖喜歡這個 -

@{ 
    Layout = "~/Views/Shared/_Layout_2.cshtml"; 
    ViewData["Title"] = "Page Title"; 
} 

看看是否有幫助。

+2

我這樣做了,但我不喜歡這樣。這不是優雅。 – Wasyster

+1

對我來說,另一種方法似乎是在屁股疼痛。 – VSO

15

,您仍然可以做的非常相似,你原來的做法事,用ViewData通過周圍的佈局名稱(雖然我將其創建爲Result Filter):

public class ViewLayoutAttribute : ResultFilterAttribute 
{ 
    private string layout; 
    public ViewLayoutAttribute(string layout) 
    { 
     this.layout = layout; 
    } 

    public override void OnResultExecuting(ResultExecutingContext context) 
    { 
     var viewResult = context.Result as ViewResult; 
     if (viewResult != null) 
     { 
      viewResult.ViewData["Layout"] = this.layout; 
     } 
    }   
} 

然後在_ViewStart.cshtml文件:

@{ 
    Layout = (string)ViewData["Layout"] ?? "_Layout"; 
} 

最後,假設你創建一個新的佈局像Views/Shared/_CleanLayout.cshtml,您可以使用該屬性的任何控制器或行動:

[ViewLayout("_CleanLayout")] 
public IActionResult About() 
{ 
    //... 
} 
0

如果你想有基於某些條件不同的佈局,你可以在_ViewStart.cshtml文件中使用此代碼:

@{ 
    if (some condition) 
    { 
     Layout = "_Layout1"; 
    } 
    else if (some other condition) 
    { 
     Layout = "_Layout2"; 
    } 
    etc. 
} 

我在項目中的一個使用。在我的情況下,條件是User.IsInRole("admin")和我_ViewStart.cshtml文件如下:

@{ 
    if (User.IsInRole("admin")) 
    { 
     Layout = "_AdminLayout"; 
    } 
    else 
    { 
     Layout = "_Layout"; 
    } 
} 

由於只有兩個在我的項目角色,這導致只有一個條件,這種解決方法是不是在我的情況太糟糕了。我希望有人在類似的情況下會發現這有用:)

+0

如何在應用程序啓動時在viewStart中獲取User對象? –

+0

如果您使用的是Razor,它應該默認可用。 intellisense甚至應該提出這個建議(這是我知道的Visual Studio 2015+)。讓我知道如果你有問題訪問這個,所以我可以給你一隻手 – demonicdaron

+0

這正是我想要做的,除了我想緩存用戶會話User.IsInRole(「管理」)的結果,因此它不會對於每個請求都不會觸發(讓它只是在會話中爲每個後續請求檢索它)。我已經實現了我自己的「SessionCacheService」,在這裏我有一些預定義的會話變量,該服務可以在ViewStart.cshtml文件中使用嗎?把這個服務的依賴注入放在ViewStart.cshtml中? – ganders