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