13

所以我有一个布局页面

<head>
    @RenderSection("HeaderLast", required: false)
</head>

一个看法

@section HeaderLast
{
    <script src="@Url.Content("~/Scripts/knockout-1.2.0.js")"
                            type="text/javascript"></script>
}

<div id="profile-tab">
        @{ Html.RenderPartial("_userProfile"); }
</div>

和局部视图

@section HeaderLast
{
    <script type="text/javascript">
        alert('test');
    </script>
}

<div......

我想不可能这么简单。是否有一种开箱即用的正确方法,或者这是否总是需要某种中介并在 ViewData 周围传递东西以手动使内容冒泡到布局页面?

赏金开始:赏金将奖励给为这个缺点提供的最佳解决方案。如果没有提供答案,我会将其奖励给 @SLaks,因为它最初回答了这个问题。

4

5 回答 5

8

您不能在局部视图中定义部分。

相反,您可以将 Javascript 放入 中ViewBag,然后发出ViewBag在布局页面中找到的任何 Javascript。

于 2011-05-12T17:16:56.893 回答
6

@JasCav:如果一个部分需要自己的 CSS,它没有很好的方法来渲染它。

如果这是使用它的原因,那么它很可能是设计使然。

你不想有一个单独的 CSS 文件 x partial/helper. 请记住,每个单独的 CSS 文件意味着从服务器获取它的单独请求,因此会影响页面呈现时间的额外往返。

此外,您不希望从部分/帮助程序直接向 HTML 发出 CSS。相反,您希望它具有适当的钩子,您可以使用它来定义站点 CSS 文件中的所有外观。

当启用 JavaScript 时,您可以使用与 CSS 相同的钩子来激活所涉及元素的自定义 JavaScript 行为。

最后,您可能需要的不是部分视图,而是用于某些页面的额外布局。使用这种方法,您将拥有:

  • 像您现在可能在 _ViewStart 上自动设置的主布局。这定义了您的示例中的部分。
  • 子布局页面。在这里,您拥有这些视图所需的额外 html、css、js。这会同时使用 @RenderBody() 和 @section SomeSection { } 来构建您常见的额外布局。
  • 一些指向子布局的视图,以及其他使用默认主布局的视图。

如何为子布局获取额外数据超出了问题的范围,但您有多种选择。就像为您的实体建立一个共同的基础一样;使用 ViewBag 或调用 Html.RenderAction 来获取与布局中共享动态元素相关的共享逻辑。

于 2011-05-17T17:00:21.907 回答
1

看起来在 SO 上有一个类似的问题 -如何从局部视图将 JavaScript 渲染到 MasterLayout 部分?.

不幸的是,不可能在局部视图中声明部分。那是因为 RenderPartial 最终呈现完全独立的视图页面。有一个解决方法,虽然有点难看。但是如果使用强类型模型而不是 ViewData,它看起来会更好。

基本上,您需要跟踪对调用 RenderPartial 的视图的引用,并在传递的对象上使用 DefineSection 方法将数据推送到该视图。

更新:还有一篇关于处理 RenderSection的博客文章,您可能会发现它很有用。

于 2011-05-24T12:34:06.343 回答
1

这是使用辅助方法和模板化委托的另一种方法 http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx

于 2011-08-19T09:53:30.660 回答
0

作为对我的问题的跟进,JavaScript/CSS 组合器/压缩器工具Cassette支持此功能,以允许您划分 JavaScript 和部分所需的其他资产。

我购买了一个站点许可证,现在在我所有的 MVC 应用程序中使用它。

于 2011-10-28T14:42:14.927 回答