我处于(并非完全不寻常)在共享布局中包含div的情况:
<div class="main-content">
** views are rendered here in a fixed width container **
</div>
通常这是固定宽度,但在某些页面上,我想将“fullwidth”类添加到此容器中,这样可以填充整个页面宽度。在这种特定情况下,这是因为视图将托管一个需要大型工作空间的Javascript应用程序。
我可以使用jQuery做到这一点,但我不希望它在页面渲染后发生,理想情况下Razor可以将此类附加到容器中。
我有什么方法可以在视图中影响共享布局的内容? renderSection感觉非常接近我的需要但是在类属性中定义一个部分只是为了向它附加一个类名是非常疯狂的,同样复制共享布局会有点过分...
有没有办法做到这一点?
由于
答案 0 :(得分:10)
有点hack-ish但我过去曾经使用过它:
<强> _Layout.cshtml 强>
<div class="main-content @ViewBag.ContentCssClass">
@RenderBody()
</body>
<强> SomeView.cshtml 强>
@{
ViewBag.ContentCssClass = "full-width";
}
另一种方法是拥有_Layout.cshtml
和_LayoutFull.cshtml
并添加:
@{
Layout = "~/Views/Shared/_FullLayout.cshtml";
}
这可以直接在视图中,也可以在该控制器的_ViewStart.cshtml
文件中(但我从不喜欢为这么简单的更改维护两个HTML页面。)
答案 1 :(得分:1)
我通常会将控制器的名称添加为类,以帮助我区分页面。
<div class="@ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString().ToLower().Trim()">
@RenderBody()
</div>
答案 2 :(得分: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);
}
答案 3 :(得分:0)
我在类似的情况下使用过这种方法:
在_Layout.cshtml中:
<body class="@RenderSection("BodyCssClass", false)">
在任何需要覆盖正文CSS类的视图中:
@section BodyCssClass {@Html.Raw("full-width")}
这对于这么简单的事情来说似乎有些过分,但它避免使用ViewBag,这在我的书中是一件好事。