MVC3布局页面,视图,RenderPartial和将脚本文件放入标题(从局部视图)

时间:2011-05-12 16:53:08

标签: c# asp.net-mvc-3 razor partial-views layout-page

所以我有一个布局页面

<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最初回答这个问题。

5 个答案:

答案 0 :(得分:8)

您无法在部分视图中定义部分。

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

答案 1 :(得分:6)

  

@JasCav:如果某个部分需要自己的CSS,那么就没有好办法让它呈现。

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

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

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

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

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

  • 在_ViewStart上自动设置的主要布局,就像您现在可能拥有的那样。这定义了样本中的部分。
  • 儿童布局页面。在这里,您需要为这些视图提供额外的html,css,js。这使用@RenderBody()和@section SomeSection {}来构建常见的额外布局。
  • 一些指向子布局的视图,以及其他使用默认主布局的视图。

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

答案 2 :(得分:1)

看起来SO上有一个类似的问题 - How to render JavaScript into MasterLayout section from partial view?

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

基本上,您需要跟踪对调用RenderPartial的视图的引用,并对传递给该视图的对象使用DefineSection方法。

更新:还有blog post处理您可能觉得有用的RenderSection。

答案 3 :(得分:1)

答案 4 :(得分:0)

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

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