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

时间:2008-12-07 12:33:01

标签: .net asp.net asp.net-mvc scripting

我是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>

11 个答案:

答案 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>