2012-12-01 137 views
30

我有一个@RenderSection("scripts")部分的布局,我有一个包需要包含在本部分中,用于某些视图。我认为只是在视图中这样做会起作用,但它不会呈现脚本。如何在脚本部分的视图中包含脚本包

@section scripts { 
    @Scripts.Render("~/bundles/myBundle") 
} 

在我看来,我如何在脚本部分包含一个包?

布局

@Scripts.Render("~/bundles/jquery", "~/bundles/scripts") 
@RenderSection("scripts", required: false) 

查看

@section scripts { 
    @Scripts.Render("~/bundles/movie") 
} 
+1

这应该肯定能够工作并且得到支持。我会检查捆绑软件名称中的拼写错误 - 例如在你的'BundleConfig'中确保它的'〜/ bundles/movie'而不是'〜/ scripts/movie'。 – Mrchief

+0

我在这里迟到了,但显然即使在VS2015,这也可能发生。代码是正确的,但我必须重新启动VS才能正确渲染它。 – Lathejockey81

回答

13

为什么用捆绑混合rendersection?如果你选择了捆绑的路线,你可以简单地把你的脚本放在.JS文件中,如果你喜欢,可以把它放在自己的捆绑包中,然后在视图上调用捆绑包。对于前:

 bundles.Add(new ScriptBundle("~/bundles/myscripts").Include(
        "~/Scripts/myscript1.js", 
        "~/Scripts/myscript2.js")); 

然后查看将具备以下条件:

@Scripts.Render("~/bundles/myscripts") 

另外,还要确保你的web.config已编译调试设置为类似下面错误:

<compilation debug="false" />    

它确保脚本被捆绑并缩小。

更新基于意见和我最近的经验

,我可以看到,为什么我们要使用两个在一起。完美的社区学习案例! :)所以,如果你决定回来重构,我会确保没有错别字。如果仍然无法使用,请告诉我问题是什么,我会相应地更新答案。感谢大家!

+1

因为我需要在布局中的jQuery包之后加载该包。通过在我的视图中像上面那样呈现包,它将呈现在jquery包之前。 – bflemi3

+0

通常我把jQuery包放在顶部,不像页面底部的默认值,一切正常。结帐此MVC音乐商店代码https://github.com/tekpub/mvcmusic/tree/master/MvcMusicStore – Yogiraj

+4

您可能不想在每个页面上呈现所有内容。切片让你控制。把所有东西都放在头上是一个可怕的解决方案(jQuery可能是个例外)。 – Mrchief

35

试试下面提及的查看内的解决方案。

查看

@section Scripts{ 
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/movie")"></script> 
} 
+11

将此作为接受的答案。 –

+0

为什么这应该是公认的答案?它忽略了'debug'标志。 – Dementic

+1

@Dementic你为什么不把自己的答案呢? – Sampath

2

我不能复制您有

@section scripts { 
    @Scripts.Render("~/bundles/movie") 
} 

问题渲染罚款没有问题(和尊重调试标志) 我会@Mrchref同意并重新检查路径上的其他

一方面,你可以使用这样的事情:

public static class Helpers 
{ 
    public static HtmlString StaticContent(this System.Web.Mvc.UrlHelper url, string contentPath) 
    { 
     return new HtmlString(System.Web.Optimization.Scripts.Render(contentPath).ToString()); 
    } 
} 

用法:

@section Scripts{ 
    @Url.StaticContent("~/assets/js/jquery") 
} 

我会建议不使用它原样, 你需要找到另一种System.Web.Optimization.Scripts.Render(contentPath).ToString()解决方案,因为它基本上呈现你正在使用(和不工作)相同的功能。

你应该玩弄System.Web.Optimization.BundleTable.Bundles,看看你是否可以查询两个版本,检查调试标志,并提供正确的内容。

1

我相信一个新的构建可以解决您的问题。请按照以下步骤,如果没有:

  • 步骤1:加入到BundleConfig.cs

    bundles.Add(new ScriptBundle("~/bundles/common").Include("~/Scripts/common.js"));

  • 第2步这样:view/layout

    @Scripts.Render("~/bundles/common")

    加入这行
  • 第3步:构建您的项目并运行它。