在ASP.NET MVC的母版页中使用脚本

我对ASP.NET MVC相当陌生,而且在脚本方面遇到了一些麻烦……特别是,我想在大多数页面中使用jQuery,因此将它放在主页面中是有意义的。 但是,如果我(从我的~/Views/Shared/Site.Master ):

 <script src="../../Scripts/jquery-1.2.6.js" type="text/javascript"></script> 

那么,这实际上是什么下降到客户端 – 这当然只有当我们目前的路线恰好具有适当的级别。 以~/Scripts/...开始不起作用。 以/Scripts/...开头只会在项目位于站点根目录时才起作用(我不想这么做)。

我有一个工作方法(我会在下面发布) – 但是:我错过了什么?

我宁愿不必涉及脚本pipe理器,因为这似乎打败了ASP.NET MVC模型的简单性…或者我担心太多了吗?

这就是我能得到它的工作方式,这也适用于非平凡的虚拟 – 但它似乎过于复杂:

 <script src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>" type="text/javascript"></script> 

我有一个AppHelper类与一些方法添加脚本引用:

 public static string ReferenceScript(string scriptFile) { var filePath = VirtualPathUtility.ToAbsolute("~/Scripts/" + scriptFile); return "<script type=\"text/javascript\" src=\"" + filePath + "\"></script>"; } 

所以在你的母版页你可以使用:

 <%= AppHelper.ReferenceScript("jquery-1.2.6.js") %> 

我认为最简单的方法是使用以下,并在视图中工作。

 <script type="text/javascript" src="<%=ResolveUrl("~/Scripts/myscript.js") %>"> </script> 

基于其他回复,也许是Html(这是MVC很常见)的扩展方法,类似于Eduardo的回答:

  <%=Html.Script("~/Scripts/jquery-1.2.6.js")%> 

附:

 public static string Script(this HtmlHelper html, string path) { var filePath = VirtualPathUtility.ToAbsolute(path); return "<script type=\"text/javascript\" src=\"" + filePath + "\"></script>"; } 

为什么不把您的母版页指向Google的js文件托pipe ? 然后,即使在部署(假设您的网站是面向networking),你可以滥用可能预caching的jQuery文件?

我做了一些OJ提到的东西,我用这个方法创build了一个GoogleHelper类

 public static string ReferenceGoogleAPI() { var appSettings = new AppSettingsReader(); string apiKey = appSettings.GetValue("GoogleApiKey", typeof(string)).ToString(); return ReferenceGoogleAPI(apiKey); } public static string ReferenceGoogleAPI(string key) { return "<script type=\"text/javascript\" src=\"http://www.google.com/jsapi?key=" + key + "\"></script>"; } public static string ReferenceGoogleLibrary(string name, string version) { return "<script type=\"text/javascript\">google.load(\"" + name + "\", \"" + version + "\");</script>"; } 

现在我添加额外的方法来获得一些ClientLocation数据;)

在工作中,我们正在从后面的ASP代码中做这样的事情:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Const jQuery As String = "jQuery" With Me.Page.ClientScript If Not .IsClientScriptIncludeRegistered(jQuery) Then .RegisterClientScriptInclude(jQuery, VirtualPathUtility.ToAbsolute("~/Includes/jQuery-1.2.6.js")) End If End With End Sub 

我不知道是否有可能与ASP.NET MVC做到这一点。

ResolveUrl是最优雅的解决schemeIMO。 虽然这是一个真正的耻辱,CSS的URL是由runat = server而不是脚本来解决的。

你应该看看使用像挤压它的实用程序。 它可以聚合和混淆你所有的CSS和JS文件。 或者你可以使用它来生成脚本标记,如果你只是通过使用ForceDebug()保持更多的debugging,

http://www.codethinked.com/squishit-the-friendly-aspnet-javascript-and-css-squisher

我只是使用斜线(/)。 例如:

 <script src="/Script/jquery-1.4.1.js"></script> 

当“jquery-1.4.1.js”文件位于根目录的Script目录下时。 它完美的作品。

我们的应用程序使用虚拟目录进行部署,我们在这里提到的其他答案也有一些问题(不正确地解决path)。 一种行之有效的方式,(不是唯一的方法),就是使用这个:

 <script src="<%=Request.ApplicationPath%>/Web/AppName/JavaScript/jquery-1.4.1.js"></script> 

您可以尝试使用Razor语法的Url.Content扩展方法

 <script src="@Url.Content("~/Scripts/jquery.min.js")" type="text/javascript"></script>