12

我处于(并非完全不寻常)在我的共享布局中有一个包含 div 的情况:

<div class="main-content">
    ** views are rendered here in a fixed width container **
</div>

通常这是固定宽度,但在某些页面上,我想将类“fullwidth”添加到这个容器中,这样它就可以填充整个页面宽度。在这种特定情况下,这是因为视图将托管一个需要大工作空间的 Javascript 应用程序。

我可以用 jQuery 做到这一点,但我不希望它在页面呈现后发生,理想情况下 Razor 可以将此类附加到容器中。

我有什么办法可以从视图中影响共享布局的内容?renderSection 感觉非常接近我的需要,但是在类属性中定义一个部分只是为了将一个类名附加到它是非常疯狂的,同样复制共享布局将是矫枉过正......

有没有办法做到这一点?

谢谢

4

4 回答 4

11

有点hack-ish,但我过去曾使用过它:

_Layout.cshtml

<div class="main-content @ViewBag.ContentCssClass">
    @RenderBody()
</body>

SomeView.cshtml

@{
    ViewBag.ContentCssClass = "full-width";
}

另一种选择是使用_Layout.cshtmland_LayoutFull.cshtml并添加:

@{
    Layout = "~/Views/Shared/_FullLayout.cshtml";
}

这可以直接在视图中,也可以在该控制器的_ViewStart.cshtml文件中(但我从不喜欢有两个 HTML 页面来维护这样一个简单的更改)。

于 2013-09-27T15:42:18.770 回答
2

我在类似的情况下使用过这种方法:

在 _Layout.cshtml 中:

<body class="@RenderSection("BodyCssClass", false)">

在任何需要覆盖 body 的 CSS 类的视图中:

@section BodyCssClass {@Html.Raw("full-width")}

对于这么简单的事情,这似乎有点矫枉过正,但它避免了使用 ViewBag,这在我的书中是一件好事。

于 2016-11-11T10:46:27.270 回答
1

我通常将控制器的名称添加为一个类,以帮助我区分页面。

<div class="@ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString().ToLower().Trim()">
    @RenderBody()
</div>
于 2013-09-27T15:49:56.747 回答
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);
        }
于 2014-10-07T12:39:33.027 回答