所以我有一个布局页面
<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最初回答这个问题。
答案 0 :(得分:8)
您无法在部分视图中定义部分。
相反,您可以将Javascript放在ViewBag
中,然后在布局页面中发出ViewBag
中找到的任何Javascript。
答案 1 :(得分:6)
@JasCav:如果某个部分需要自己的CSS,那么就没有好办法让它呈现。
如果这是使用它的原因,那很可能是设计上的。
您不希望拥有单独的CSS文件x partial / helper。请记住,每个单独的CSS文件意味着从服务器获取它的单独请求,因此额外的往返会影响呈现页面的时间。
此外,您不希望从部分/帮助程序向HTML发出直接CSS。相反,您希望它具有适当的钩子,您可以使用它来定义站点的CSS文件中的所有外观。
您可以使用与CSS相同的钩子来激活JavaScript所启用的元素的自定义JavaScript行为。
最后,您可能需要的不是部分视图,而是用于某些页面的额外布局。通过这种方法,你可以:
如何为子项获取额外数据布局超出了问题的范围,但您有多种选择。就像为你的实体建立一个共同的基础;使用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)
这是使用辅助方法和模板化委托的另一种方法 http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx
答案 4 :(得分:0)
作为我的问题的后续跟踪,JavaScript / CSS组合器/缩放器工具Cassette支持此功能,允许您划分部分所需的JavaScript和其他资产。
我购买了一个站点许可证,并在我的所有MVC应用程序中使用它。