0

我的 ASP.NET MVC 项目有一个奇怪的路由问题,希望你们能帮助我。

总体而言,当我在本地主机上运行项目或在服务器上运行项目时一切正常,而它直接部署在http://myServerName. 当我将应用程序部署到位于不同虚拟目录下的服务器上的各种环境时,问题就开始了。例如:http://myServerName/QaEnviornmenthttp://myServerName/TestEnviornment

问题是对应用程序 URL 的所有 Javascript 调用都会忽略我的环境虚拟目录并失败。例如,在我的 QA 服务器上,每当我必须进行 Ajax 调用时,我都会采用标准方法,例如:

var myUrl = '/ControllerName/ActionMethodName/'
$.ajax({url:myUrl,success:function(){Do stuff} })

因为我的应用程序部署在 上http://myServerName/QaEnviornment,所以在呈现时我希望 myUrl 是http://myServerName/QaEnviornment/ControllerName/ActionMethodName. 相反,它回来了as http://myServerName/ControllerName/ActionMethodName,当然失败了。

为了暂时解决这个问题,我声明了一个包含环境文件夹名称的全局 Javascript 变量,当我为 javascript 调用构建 URL 时,我必须记住始终将它们构造为 varmyUrl = myGlobalFolderVar + '/ControllerName/ActionMethodName/'

使用全局 JavaScript 变量来解决这个问题对我来说似乎是一个糟糕的解决方案。我可以做些什么来使路由正常工作,以便每当进行 JavaScript 调用时,应用程序在其下运行的任何子文件夹始终包含在 URL 中?

4

1 回答 1

1

不必总是记住正确构造它们,而是创建一个您调用的辅助函数来创建您的 URL

function CreateUrl(string path){
    return myGlobalFolderVar + path;
}

回答你的第二个问题,不是真的。路由不知道是什么发出了请求,您不能总是依赖X-Http-RequestedWith标头来做出决定。此外,您的站点应用程序根不在域根目录中,因此路由只会在访问您的应用程序时启动。我知道的唯一另一种方法是让 MVC 实际为您生成 Url ( var url = '@Url.RouteUrl(params)';),但是当您将 JavaScript 放在单个或几个 .js 文件中时,这根本没有帮助。

编辑

上面的函数是一个 JavaScript 函数,可以放在应用程序中的任何位置,包括外部 JS 文件。至于设置你的 myGlobalFolderVar,有几种方法可以设置它。

1.实际上硬编码外部JS文件中的变量。

var myGlobalFolderVar = 'TestEnviornment';

但是,如果您要部署到多个不同的测试服务器,这很难。

2.如果您使用 web.config 转换,您可以根据构建类型在 web.config 转换中添加 AppSettings 键/值对。然后,使用该值,在母版页布局/视图中设置全局 Javascript 变量。

  <appSettings xdt:Transform="Replace">
    <add key="folderLocation" value="TestEnvironment" />
  </appSettings>

在您的外部 JS 文件中

//this makes it a site wide/global variable in any place you 
//include your external JS file
    var myGlobalFolderVar = '';

在您的主视图中

<script type="text/javascript">
   myGlobalFolderVar = '@ConfigurationManager.AppSettings["folderLocation"]'
</script>

3.与第二个相同,但使用 URL 帮助程序来确定应用程序在主视图中的路径,而不是使用 web.config 转换

<script type="text/javascript">
    myGlobalFolderVar = '@Url.Content("~/")'
</script>

基本思想是使用 .NET 找出它所在的位置并使用该路径信息设置一个全局 JavaScript 变量。然后,结合此答案顶部提供的辅助 JavaScript 函数,您可以在整个应用程序中根据需要正确生成路径 - 无论路径深度、部署位置或任何其他部署类型问题如何。

var myUrl = CreateUrl('/ControllerName/ActionMethodName/');
$.ajax({url:myUrl,success:function(){Do stuff} });
于 2012-10-26T22:35:28.627 回答