根据控制器的名称,在布局中有条件地包括样式表

时间:2011-05-02 19:37:36

标签: asp.net-mvc

我正在学习ASP.NET MVC 3框架。在我的布局页面(_Layout.cshtml)中,我想有条件地包含一些CSS样式表,具体取决于控制器的名称。我该怎么做?

4 个答案:

答案 0 :(得分:6)

您可以使用以下属性获取当前控制器名称:

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()

答案 1 :(得分: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)中使用它。

答案 2 :(得分:1)

Darin肯定回答了您的问题,但另一种方法是使用控制器名称作为页面上某些HTML元素的ID,这样可以灵活地自定义控制器级视图,但将CSS保存在一个文件中。

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

答案 3 :(得分: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
}

您也可以将控制器名称作为参数传入,并使此扩展方法返回一个bool。