在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>
- 为什么包含XML头时C#XmlDocument.LoadXml(string)失败?
- 如何遍历c#.net中目录中的所有文件?
- 在.NET中将URIpath转换为相对文件系统path
- .NET中的对象引用有多大?
- 在序列化“SubSonic.Schema .DatabaseColumn”types的对象时检测到循环引用。
- string.IsNullOrEmpty(string)与string.IsNullOrWhiteSpace(string)
- 如何在WindowsC ++ / CLI中获取应用程序可执行文件的名称?
- 如何将CSS类属性添加到razor的文本框?
- 在.NET 4.5中更改了string.Empty(或System.String :: Empty)的行为