2011-05-02 58 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 
} 

你也可以通过在控制器的名称作为参数,使这个扩展方法返回一个布尔值。