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

Chr*_*sic 13 c# partial-views razor layout-page asp.net-mvc-3

所以我有一个布局页面

<head>
    @RenderSection("HeaderLast", required: false)
</head>
Run Code Online (Sandbox Code Playgroud)

一个看法

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

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

和部分观点

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

<div......
Run Code Online (Sandbox Code Playgroud)

我认为这不可能那么简单.有没有一种正确的方法来开箱即用,或者这总是需要某种调解器并传递ViewData周围的东西来手动使内容冒泡到布局页面?

赏金开始了:赏金将奖励为此短期提供的最佳解决方案.如果没有提供答案,我会将其授予@SLaks最初回答此问题.

SLa*_*aks 8

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

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

  • 我同意Chris和SLaks,这很烦人.我希望能够以模块化方式使用自己的css和js开发部分视图,并且有一个渲染局部视图的机制,负责将css和js正确放入DOM中.SLaks,你的解决方案有一个例子吗? (4认同)

egl*_*ius 6

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

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

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

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

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

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

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

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