2013-09-27 122 views
8

我在我共享佈局具有含div的(不完全異常)的情況是添加類共享佈局父格但在某些頁面上,我想將「fullwidth」類添加到此容器中,以允許它填充整個頁面寬度。在這種特定情況下,這是因爲該視圖將託管一個需要大工作空間的Javascript應用程序。MVC剃刀從子視圖

我可以用jQuery做到這一點,但我不希望它在頁面渲染後發生,理想情況下Razor可以將此類附加到容器。

有沒有什麼辦法可以影響視圖內共享佈局的內容? rendersection感覺非常接近我所需要的,但定義一個class屬性中的一個部分只是爲了追加一個類名稱是相當瘋狂的,類似地,重複共享的佈局會是過度的...

有沒有辦法這樣做?

感謝

黑客十歲上下的

回答

8

類,但我已經在過去使用它:

_Layout.cshtml

<div class="main-content @ViewBag.ContentCssClass"> 
    @RenderBody() 
</body> 

SomeView.cshtml

@{ 
    ViewBag.ContentCssClass = "full-width"; 
} 

另al ternative是有一個_Layout.cshtml_LayoutFull.cshtml並添加:

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

這可以是直接在視圖中,或在控制器的_ViewStart.cshtml文件(但我從來沒有像有兩個HTML頁面來維持這樣一個簡單的變化) 。

+0

這很聰明。很好的答案 –

+0

完美的感謝, 將這個問題保持一段時間,以查看是否有任何「最佳做法」的答案,但這正是我所尋找的 – managedheap84

1

我通常會將控制器的名稱添加爲類,以幫助我在頁面之間進行區分。

<div class="@ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString().ToLower().Trim()"> 
    @RenderBody() 
</div> 
+0

好主意,我想我會開始做這個自己 – managedheap84

0

要在科林的回答擴大我使用了一個幫手:

<body class="@Html.RouteHint()"> 

用下面的擴展方法

public static class HtmlHelperExtensions 
    { 
     public static MvcHtmlString RouteHint<T>(this HtmlHelper<T> htmlHelper, string additionalRouteDataName = "key") 
     { 
      var routeData = htmlHelper.ViewContext.RouteData; 
      var areaName = routeData.DataTokens["area"]; 
      var controllerName = routeData.GetRequiredString("controller"); 
      var actionName = routeData.GetRequiredString("action"); 
      var additionalValue = routeData.Values[additionalRouteDataName]; 
      var className = string.Format("{0} {1} {2} {3}", areaName, controllerName, actionName, additionalValue) 
       .TrimStart() 
       .TrimEnd() 
       .ToLower(); 

      return new MvcHtmlString(className); 
     } 
0

我用這個方法了類似的情況:

In _Layout.cshtml:

<body class="@RenderSection("BodyCssClass", false)"> 

在其中需要覆蓋身體的CSS類的任何觀點:

@section BodyCssClass {@Html.Raw("full-width")} 

這似乎有點小題大做了這樣一個簡單的事情,但它避免使用ViewBag,這是在我的書是一件好事。