【问题标题】:How do you reference .js files located within the View folders from a Page using Asp.net MVC如何使用 Asp.net MVC 从页面引用位于视图文件夹中的 .js 文件
【发布时间】:2010-09-09 21:40:04
【问题描述】:

例如,如果我有一个位于 Views/Home/Index.aspx 的页面和一个位于 Views/Home/Index.js 的 JavaScript 文件,您如何在 aspx 页面上引用它?

即使编译器说路径正确,下面的示例也不起作用

<script src="Index.js" type="text/javascript"></script>

完全相同的问题已在此处更详细地发布: http://forums.asp.net/p/1319380/2619991.aspx

如果目前无法做到这一点,那么将来还会有吗?如果没有,每个人都如何管理大型 Asp.net MVC 项目的 javascript 资源?您是否只是在 Content 文件夹中创建一个文件夹结构来反映您的 View 文件夹结构?呸!

【问题讨论】:

    标签: c# javascript asp.net-mvc


    【解决方案1】:

    您可以使用如下所示的 VirtualPathUtility.ToAbsolute 方法将 .js 文件的应用相对 url 转换为可以写入页面的绝对 URL:

    <script type="text/javascript" src="<%=VirtualPathUtility.ToAbsolute("~/Views/Home/Index.js") %>"></script>
    

    【讨论】:

    • 我试过了,它似乎不起作用。它会生成我期望的正确 URL,但由于某种原因无法找到 js 文件。
    • 你不能在那个位置引用一个 js 文件,因为 mvc 的配置阻止了它。您必须修改 web.config 文件以允许从该位置下载 js 文件。 stackoverflow.com/a/24763515/489000
    【解决方案2】:

    您应该有单独的脚本文件夹结构。例如应用程序根目录下的 JavaScript 文件夹。使用视图存储 js 文件不仅会影响路径解析问题,还会影响安全性和权限。此外,如果您决定将来将某些应用程序部件存储在专用子文件夹中时单独部署它们,那么以后将 JS 文件作为程序集资源嵌入会容易得多。

    【讨论】:

      【解决方案3】:

      对于共享的 javascript 资源,使用 Content 文件夹是有意义的。问题是我特别想解决的是永远不会重复使用的特定于 aspx 页面的 javascript。

      我认为我要做的就是将特定于 aspx 页面的 javascript 放在页面本身上,并将共享的 js 资源保存在 Content 文件夹中。

      【讨论】:

      • 我正在寻找与您相同的方法。除了填充页面或添加到内容目录之外,您是否发现了任何其他内容?
      • 我今天也遇到了同样的问题。完全同意您在原始帖子中的“YUCK”。但是我认为把它放到页面本身就更恶心了!我的第一个想法是,可能是路由阻止了 Views 文件夹下的 js 文件被提供。你最后有没有成功解决这个问题?
      【解决方案4】:

      这是一个很好的 HtmlHelper 扩展方法:

      public static class JavaScriptExtensions
      {
          public static string JavaScript(this HtmlHelper html, string source)
          {
              TagBuilder tagBuilder = new TagBuilder("script");
              tagBuilder.Attributes.Add("type", "text/javascript");
              tagBuilder.Attributes.Add("src", VirtualPathUtility.ToAbsolute(source));
              return tagBuilder.ToString(TagRenderMode.Normal);
          }
      }
      

      像这样使用它:

      <%=Html.JavaScript("~/Content/MicrosoftAjax.js")%>
      

      【讨论】:

        【解决方案5】:

        如果您将页面重新路由到自定义 RouteHandler,则可以在将 RequestContext 处理给 MvcHandler 类之前检查文件是否存在。

        示例(不完整):

        public class RouteHandler : IRouteHandler
        {
            public IHttpHandler 
            GetHttpHandler(RequestContext requestContext)
            {
                var request = requestContext.HttpContext.Request;
        
                // Here you should probably make the 'Views' directory appear in the correct place.
                var path = request.MapPath(request.Path); 
                if(File.Exists(path)) {
                    // This is internal, you probably should make your own version.
                    return new StaticFileHandler(requestContext);
                }
                else {
                    return new MvcHandler(requestContext);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-17
          • 2012-03-01
          • 2011-08-16
          相关资源
          最近更新 更多