【问题标题】:MVC razor - add class to shared layout parent div from a child viewMVC razor - 从子视图将类添加到共享布局父 div
【发布时间】:2013-09-27 15:37:00
【问题描述】:

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

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

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

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

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

有没有办法做到这一点?

谢谢

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    有点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 页面)。

    【讨论】:

    • 非常感谢,会暂时保留这个问题,看看是否有任何“最佳实践”的答案,但这正是我想要的
    【解决方案2】:

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

    在_Layout.cshtml中:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      <div class="@ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString().ToLower().Trim()">
          @RenderBody()
      </div>
      

      【讨论】:

        【解决方案4】:

        为了扩展 Colin 的答案,我使用了一个助手:

        <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);
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-11
          • 1970-01-01
          • 2020-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多