我是ASP.NET MVC的新手,我在使用脚本方面遇到了一些麻烦...特别是,我想在大多数页面中使用jQuery,所以将它放在母版页中是有意义的。但是,如果我这样做(来自我的~/Views/Shared/Site.Master
):
<script src="../../Scripts/jquery-1.2.6.js" type="text/javascript"></script>
然后,这就是客户端的真实情况 - 当然,只有当前路线恰好具有正确数量的水平时,才有效。从~/Scripts/...
开始不起作用。从/Scripts/...
开始只有在项目位于站点根目录时才会起作用(我不想假设)。
我有一种工作方法(我将在下面发布) - 但是:我错过了什么?
我宁愿不必涉及脚本管理器,因为这似乎打败了ASP.NET MVC模型的简单性......或者我担心太多了?
这是我可以使其工作的方式,这也适用于非平凡的虚拟 - 但它似乎过于复杂:
<script src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>" type="text/javascript"></script>
答案 0 :(得分:45)
我有一个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") %>
答案 1 :(得分:36)
我认为最简单的方法是使用以下内容,它可以在视图中使用。
<script type="text/javascript" src="<%=ResolveUrl("~/Scripts/myscript.js") %>">
</script>
答案 2 :(得分:20)
基于其他回复,可能是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>";
}
答案 3 :(得分:10)
为什么不将您的母版页指向Google's js file hosting?那么即使在部署方面(假设您的网站面向网络),您可以滥用预先缓存的jquery文件吗?
答案 4 :(得分:4)
我做了一些OJ提到的内容,我用这种方法创建了一个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数据;)
答案 5 :(得分:1)
在工作中,我们正在通过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做到这一点。
答案 6 :(得分:1)
ResolveUrl是IMO最优雅的解决方案。虽然真的很遗憾,但是CSS的url是由runat = server解决的,而不是脚本。
答案 7 :(得分:1)
你应该看看使用像挤压它的实用程序。它可以为您聚合和混淆所有的css和js文件。或者,如果您只是使用ForceDebug()
将其保存在调试中,则可以使用它来生成脚本标记http://www.codethinked.com/squishit-the-friendly-aspnet-javascript-and-css-squisher
答案 8 :(得分:1)
我只使用斜杠(/)。 例如:
<script src="/Script/jquery-1.4.1.js"></script>
当“jquery-1.4.1.js”文件位于root的Script目录中时。 而且效果很好。
答案 9 :(得分:0)
我们的应用程序是使用虚拟目录部署的,我们在这里提到的其他答案存在一些问题(没有正确解析路径)。一种运作良好的方法(不是唯一的方法),就是使用它:
<script src="<%=Request.ApplicationPath%>/Web/AppName/JavaScript/jquery-1.4.1.js"></script>
答案 10 :(得分:0)
您可以使用Razor语法
尝试Url.Content扩展方法<script src="@Url.Content("~/Scripts/jquery.min.js")" type="text/javascript"></script>