2011-05-02 59 views
3

我學習ASP.NET MVC 3框架。在我的佈局頁(_Layout.cshtml),我想有條件包括取決於控制器的名稱一些CSS樣式表。我怎麼做?佈局有條件包括樣式取決於控制器的名字

+2

不要這樣......如果你有高緩存您的瀏覽器會讓更少的請求,並已經將有必要的任何頁面的代碼的靜態域爲您的整個網站的一個CSS文件。看看SO源代碼,這是一個'css'文件。 (也是一個單一的網站js) – BrunoLM 2011-05-02 19:43:35

回答

5

你可以使用下面的屬性獲取當前的控制器名:

ViewContext.RouteData.GetRequiredString("controller") 

因此,基於它的價值,你可以包括或不樣式表:

@if (ViewContext.RouteData.GetRequiredString("controller") == "somecontrollername") 
{ 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
} 

或者使用自定義的助手:

public static class CssExtensions 
{ 
    public static IHtmlString MyCss(this HtmlHelper html) 
    { 
     var currentController = html.ViewContext.RouteData.GetRequiredString("controller"); 
     if (currentController != "somecontrollername") 
     { 
      return MvcHtmlString.Empty; 
     } 

     var urlHelper = new UrlHelper(html.ViewContext.RequestContext); 
     var link = new TagBuilder("link"); 
     link.Attributes["rel"] = "stylesheet"; 
     link.Attributes["type"] = "text/css"; 
     link.Attributes["href"] = urlHelper.Content("~/Content/Site.css"); 
     return MvcHtmlString.Create(link.ToString(TagRenderMode.SelfClosing)); 
    } 
} 

而且在佈局上簡單:

@Html.MyCss() 
2

我會用不同的方法。定義基本控制器代替,並定義方法SetStyleSheet喜歡:

public abstract class BaseController : Controller 
{ 
    protected override void Intialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     SetStyleSheet(); 
    } 

    protected virtual void SetStyleSheet() 
    { } 
} 

在派生類可以覆蓋SetStyleSheet設置類似ViewData["styleSheet"]並在母版頁(_Layout.cshtml)使用它的例子。

1

達林肯定回答了你的問題,而是一個替代方法是使用控制器的名稱一些HTML元素的網頁上的ID,這將讓你自定義控制器級視圖的靈活性,但保持你的CSS在一個文件中。

<body id="<%=ViewContext.RouteData.GetRequiredString("controller").ToLower() %>"> 
    ... content here 
</body> 
0

我做了另外一個擴展方法ControllerContext因爲ViewContext時已位於來源於它,你可以直接打電話給你的方法。

例如:

public static class ControllerContextExtensions 
{ 
    public static string GetControllerName(this ControllerContext helper) 
    { 
     if (helper.Controller == null) 
     { 
      return string.Empty; 
     } 

     string[] fullControllerNames = helper.Controller.ToString().Split('.'); 

     return fullControllerNames[fullControllerNames.Length-1].Replace("Controller",string.Empty); 
    } 

} 

而在你_layout使用此:

@if(ViewContext.GetControllerName() == "MyControllerName") 
{ 
    //load my css here 
} 

你也可以通過在控制器的名稱作爲參數,使這個擴展方法返回一個布爾值。