在ASP.NET MVC视图中包含脚本引用的最佳方法是什么?

Jon*_*vis 2 javascript asp.net-mvc markup

如您所知,ASP.NET MVC将视图标记存储在Views目录中,该目录在层次结构上与ASP.NET MVC Web应用程序中使用的URL路由不兼容.另一方面,在ASP.NET Web Forms(以及ASP.NET MVC中)中,URL可以并且通常具有嵌套的"目录",或者更确切地说是路径分隔符,这与Web应用程序通常不具备的事实相结合托管在URL的根路径中,而不是在子目录中,即"/ stuff/here/MyActualApp",有必要使用相对于应用程序根目录的脚本路径,而不是相对于URL的根目录.但是,同时,Visual Studio脚本intellisense指示URL相对于正在编辑的文件进行映射.

此外,我遇到了很多问题,使用runat ="server"虚拟化根路径以支持"〜/",例如头标记也需要runat ="server",这引入了各种其他约束.

最后,还有一件事:如果除了智能感知功能之外还引用了像jQuery这样的脚本的缩小风格,Visual Studio将会对此不予理睬.因此,您几乎必须使用转义代码来防止VS无法进行操作.

自从VS 2005以来,我一直在Visual Studio 2010中使用这种语法或其变体,以便在我的ASP.NET视图标记中包含脚本来处理ASP.NET MVC视图文件的嵌套文件夹的不一致(它们不行使用实际的URL)以及使用jQuery的vsdoc风格而不是缩小版本的需要,以便我得到intellisense工作.

<%if (false) { %>
<script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
<% } %>
<%= "<script type=\"text/javascript\"" src=\"" 
  + ResolveUrl("~/Scripts/jquery-1.4.1.min.js") + "\"></script>"%>
Run Code Online (Sandbox Code Playgroud)

除了使用CDN URL之外,还有比这更好的方法吗?它很丑.我希望微软现在可以解决这个问题,而不需要使用ScriptManager标签(这需要服务器端表单以及使标记更加冗长).

注意:我的问题不在于Intellisense支持,而是上面代码中的最后一行,必须发出一行而不是仅使用真正的标记.但是,我也想要intellisense支持准备.

que*_*rin 6

我们使用SquishIt.它也结合并缩小了文件,并支持css(甚至dotLess).

<head>
  <%= Bundle.Css()
    .Add("~/media/css/style.less")
    .Add("~/media/css/print.css")
    .Add("~/media/css/media.css")
    .Render("~/media/css/styles_#.css") %>
  <%= Bundle.JavaScript()
    .Add("~/media/js/jquery-1.4.3.js")
    .Add("~/media/js/jquery.equalHeights.js")
    .Add("~/media/js/jquery.cycle.lite.1.0.js")
    .Add("~/media/js/swfobject-2.2.js")
    .Add("~/media/js/site.js")
    .Render("~/media/js/js_#.js") %>
</head>
Run Code Online (Sandbox Code Playgroud)

T4MVC还可以提供一种引用URL的方法:

<script src="<%= Links.Scripts.Map_js %>" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)