【问题标题】:Using scripts in a master page with ASP.NET MVC通过 ASP.NET MVC 在母版页中使用脚本
【发布时间】:2010-09-25 17:46:41
【问题描述】:

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

【问题讨论】:

  • 令人讨厌的是,使用“~”前缀对 元素的 href 属性效果很好,但不适用于
  • @belugabob:是什么让你说这在脚本标签的 src 属性中不起作用?

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


【解决方案1】:

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

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

当“jquery-1.4.1.js”文件在根目录下时。 而且效果很好。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您应该看看使用像 squish 这样的实用程序。它可以为你聚合和混淆你所有的 css 和 js 文件。或者你可以使用它来生成脚本标签,如果你只是通过使用 ForceDebug() 将其保持在调试状态

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

      【讨论】:

        【解决方案4】:

        我们的应用程序是使用虚拟目录部署的,我们在此处提到的其他答案中遇到了一些问题(未正确解析路径)。一种行之有效的方法(不是唯一的方法)是使用这个:

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

        【讨论】:

        • 听起来它需要被包裹在一个 Url 助手扩展中。这样你就可以使用 Url.Content 或基于某些配置或参数的版本,也许......
        【解决方案5】:

        ResolveUrl 是 IMO 最优雅的解决方案。虽然很遗憾,CSS 的 URL 是由 runat=server 而不是脚本解析的。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 为什么要使用其他方法呢?这是最简单也是最好的。
          • 我处于敏捷生产环境中。座右铭:如果它有效,那就足够了。如果它减少了我需要做的工作量,那就更好了。如果是 2 合 1,那就太好了。这很棒。
          【解决方案7】:

          在工作中,我们正在从后面的 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 是否可以做到这一点。

          【讨论】:

          • 不,不是。 MVC 不使用相同的方法。您可能可以在视图中做类似的事情,但不会有太多目的。顺便说一句,我在您之前提出的 GetHashCode 问题上添加了注释。
          【解决方案8】:

          根据其他回复,可能是 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>";
          }
          

          【讨论】:

          • 我不希望在视图中包含脚本的路径,因此如果我必须将它们移动到另一个域或子域(或者可能是 CDN),我不必触及每个视图跨度>
          • 公平评论 - 但在这种情况下,它是一个母版页
          【解决方案9】:

          我做了一些 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 数据;)

          【讨论】:

            【解决方案10】:

            我有一个 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") %>
            

            【讨论】:

            • 我喜欢这个;对于通用 API,我现在使用 HtmlHelper 上的扩展方法做了类似的事情,但是 +1
            • 是的,我真的很喜欢扩展方法,但我创建了很多方法来引用图像、css 和 swf 文件。不要重载 HtmlHelper 类 y 创建 AppHelper 并将其命名空间添加到 web.config
            • HtmlHelper 的使用只是为了与许多其他 MVC 代码相似
            【解决方案11】:

            为什么不将您的母版页指向Google's js file hosting?那么即使在部署方面(假设您的网站面向网络),您也可以滥用可能预缓存的 jquery 文件?

            【讨论】:

            • 假设可以通过网络访问 Google,但情况并非总是如此……理想情况下,它只适用于本地网络服务器
            • .com 网站的好方法,但不一定适用于 Intranet 风格的应用程序
            • 完全同意。这纯粹是一个仅供参考的情况:)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-09
            • 2011-11-11
            • 2011-01-07
            • 2013-03-27
            • 2021-11-24
            • 2013-12-22
            相关资源
            最近更新 更多