2011-05-12 39 views
13

所以我有一个布局页面MVC3布局页面,查看,的RenderPartial和获取的脚本文件到页眉(从局部视图)

<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

该部分需要在框架的实际页面中定义,以知道它已经被照顾不? – iwayneo 2011-05-12 16:57:34

+2

我不明白这个问题 - 你想做什么,你想消除什么? – 2011-05-12 16:57:35

+0

@cvista该部分在LayoutPage中定义,因为这是标题的位置。 @Danny Tuppeny我想从部分视图中访问标题 – 2011-05-12 17:13:29

回答

8

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

取而代之,您可以将Javascript放在ViewBag中,然后发布布局页面中的ViewBag中找到的任何Javascript。

+0

有人为此做了一个nuget吗?这是一个相当明显的设计缺陷。 – 2011-05-12 17:18:44

+0

@Chris--你为什么认为这是一个明显的设计缺陷? – JasCav 2011-05-12 17:25:23

+1

@JasCav:如果一个部分需要自己的CSS,它没有好的方法来呈现它。 – SLaks 2011-05-12 17:26:18

6

@JasCav:如果一个部分需要自己的CSS,它没有好的方法来得到它的呈现。

如果这是它的使用原因,它可以很好地通过设计。

你不想有一个单独的CSS文件x partial/helper。请记住,每个单独的CSS文件都意味着一个单独的请求,以便从服务器获取它,因此会影响渲染页面的时间。

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

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

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

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

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

+0

对于这个使用多个布局页面看起来像是在梦魇维护中进行的练习。 – 2011-05-20 16:07:30

+1

我已经使用了这个方法,并且随着代码的发展它已经很好地流动了。我所做的具体方式是“调用Html.RenderAction以获取与布局中的共享动态元素相关的共享逻辑”。我非常喜欢它有一个局部视图做Html.RenderAction;必须处理不相关操作中的额外数据,以便流向部分视图或使用无类型方法传递数据。你的样本太泛化了,所以很难说,挑战属于局部视图的那件作品的概念/也许真的是一些常见布局的一部分。 – eglasius 2011-05-20 16:19:34

+0

注意真正的部分视图通常落在我的答案的第一个场景中,所以也挑战该脚本/ css是否应该从该局部视图调用与属于站点级别的CSS/js文件挂钩。也就是说,外面的场景太多了,你可能会遇到这样的情况:你要做的是最好的方法。 – eglasius 2011-05-20 16:22:04

1

看起来好像在SO - How to render JavaScript into MasterLayout section from partial view?上有类似的问题。

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

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

更新:还有一个blog post关于处理RenderSection您可能会发现有用。

+0

您发布的解决方法线程肯定有一些潜力,我仍然需要查看其他链接。 – 2011-05-24 18:39:44

0

作为后续行动,以我的问题时,JavaScript/CSS波/ minifier工具Cassette支持此功能,让您划分你的JavaScript和其他资产这是部分必需的。

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