MVC - 是否有一种很好的方法来将控件与各自的javascript捆绑在一起?

时间:2012-03-06 20:31:57

标签: javascript asp.net-mvc asp.net-mvc-3

我对MVC很新,我无法决定存储cshtml文件及其各自的javascript代码的最佳方法。我的项目中的一些JS代码需要全局运行,但大部分都与特定视图或部分视图完全相关。

如果我将javascript放在视图中,我会得到一堆内联不可缓存的javascript,如果我把它放在一个中心文件中,我会失去模块性。

我听说在MVC4中会有缩小功能,有什么我可以用MVC3做的,它允许我在视图中选择javascripts包含然后将它们分组并自动缩小它们? (甚至可能在小组中?)

5 个答案:

答案 0 :(得分:6)

Cassette它与即将推出的MVC4捆绑包基本相同。

在您的视图页面中,您可以使用Cassette的Bundles帮助程序类来引用脚本和样式表。

@{
    Bundles.Reference("Scripts/jquery.js");
    Bundles.Reference("Scripts/page.js");
    Bundles.Reference("Styles/page.css");
}
<!DOCTYPE html>
    <html>
...

此外,Cassette还支持LessCoffeScript。如果您对Knockout.jsBackbone.js等客户端MVC框架感兴趣,它还支持HTML模板。

您仍然需要选择如何对内容进行分组。正如official documentation所暗示的那样,最好的选择是将捆绑包视为部署单位

请记住,捆绑包是部署单位。如果捆绑包中的任何资产发生更改,则必须通过Web浏览器再次下载整个捆绑包。 因此,可能将共享代码分组到一个包中,并将页面脚本放入自己的包中

答案 1 :(得分:1)

您可以将javascript放在单独的文件中,用于每个视图。然后在_Layout.cshtml中输入@RenderSection到头部:

<head>
    <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script>
    @RenderSection("head",false)
</head>

然后在每个视图中,您可以放置​​一个将呈现在标题中的部分:

@section head{
    <script src="@Url.Content("~/ViewScripts/Order/New.js")" type="text/javascript"></script>
}

答案 2 :(得分:0)

答案 3 :(得分:0)

如果您要求脚本位于head标记中,那么@Anders方法很好。但我发现大多数情况下,如果它是特定于页面的JavaScript,则不需要它。您可以将您的脚本标记放在视图中所需的任何位置。 Automatically bundling and minification will be supported in ASP.NET 4.5。在此之前,您可以将yuicompressor集成到Visual Studio中。

答案 4 :(得分:0)

在partials中使用脚本(在我看来)

不是最佳做法

建议您编写部分特定脚本来分隔js并在页面加载时绑定事件,或者如果部分是通过ajax加载,则在成功事件上加载。

然后你可以确定多次绑定事件并且视图只是一个视图