Javascript中的ASP.NET MVC和相对路径

时间:2009-12-17 19:27:43

标签: javascript asp.net-mvc

这个问题是基于一个名为“ASP.NET MVC相对路径”的类似问题,位于here

我理解在开发ASP.NET应用程序时,尤其是ASP.NET MVC应用程序,会出现有关绝对路径和相对路径的问题。在整个应用程序生命周期中,我一直在使用类似于以下内容来解析ASPX页面中的路径:

<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>"></script>

我无法将路径保留为相对路径,因为它正在从开发层移动到暂存层到生产层,并且它可能位于IIS中略有不同的文件夹结构中。

然而,我的问题是,我可以对Javascript文件中的相对路径做些什么?他们怎么解决?到目前为止,我已经将每个页面的Javascript嵌入到页面本身中,因此我可以使用类似于上面的方法来解析URL。这导致Javascript看起来像这样:

$(function() {
    $.getJSON('<%= Url.Content("~/home/test/1") %>', null, function(data) {
        // Do stuff in here
    });
});

这当然可以正常工作,直到我将所有内容移出ASP.NET页面并进入位于中心的Javascript文件。正如前面提到的question所建议的那样:

  

或者您可以使用document.location.host   构建完全限定的路径名   在javascript中:   document.location.host +   “/Content/Images/MyImage.jpg”

     

另一种方法是使用ASP.NET   构建脚本的这一部分   动态地使完全   注入了合格的路径名。你   可以通过使用来做到这一点   ScriptManager.RegisterStartupScript或   ScriptManager.RegisterScriptBlock

该应用程序是一个相当沉重的Javascript用户,所以我不确定第二个选项是否会起作用。除了第一个选项之外,还有更优雅的方法来解决此问题吗?你们有什么办法来解决这个问题?任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:3)

一种方法是让你的JS脚本引用一个对象,这个对象将在包含你需要的相对路径的view / partial中构造。然后,您的JS文件代码可以使用此对象根据需要实例化路径。

有点痛苦,但这会起作用,如:

var paths = 
{
    imagePath: '<%= Url.Content("~/Content/Images/MyImage.jpg") %>'
}

var obj = myJSFileObject.Load(paths);
//continue

HTH

答案 1 :(得分:0)

虽然我还没有使用MVC,但我的Page类有一个脚本路径集合,在呈现时会自动添加到HTML页面的顶部或底部(如果适用)。

一些脚本文件由Page类本身从每个页面需要的应用程序范围的脚本列表中注册,其他脚本文件由各个页面注册。

在任何一种情况下,注册都是这样的:

 MyPage.AddScriptBlock(Path:="{apppath}scripts/myscript.js", LoadAtTop:=True)

Page类对它进行快速搜索/替换,因为它在渲染时会为它们生成SCRIPT标记:

 Writer.Write(New JavascriptBlock( _
    thisscript.Path.Replace("{apppath}", AppPath()))

AppPath()函数如下所示:

 Private Shared pvtAppPath As String
 Public Shared Function AppPath() As String
If pvtAppPath="" Then
   With System.Web.HttpContext.Current.Request
    pvtAppPath = "http://" & .Url.Host & .ApplicationPath
   End With
   If Not pvtAppPath.EndsWith("/") Then pvtAppPath &= "/"
End If
Return pvtAppPath
 End Function

这为我提供了我需要的所有功能:

  1. 我可以在每个页面上默认加载一些JavaScript文件。
  2. 我只能在单个页面上加载一些JavaScript文件。
  3. 我可以通过从集合中删除它来覆盖(1)。
  4. 我可以控制(性能)脚本是在HEAD还是在BODY的底部
  5. 我可以在开发和生产机器上使用相同的代码。
  6. 我保证会以一致的方式生成我的脚本标记。
  7. 我不确切知道这与MVC有什么关系,但希望它会给你一些想法。