在ASP.NET MVC项目中为javascript调用设置公共路由

在ASP.NET MVC项目中为javascript调用设置公共路由,javascript,asp.net-mvc,deployment,asp.net-mvc-routing,url-routing,Javascript,Asp.net Mvc,Deployment,Asp.net Mvc Routing,Url Routing,我的ASP.NETMVC项目有一个奇怪的路由问题,希望你们能帮我解决 总的来说,当我在本地主机上运行项目时,或者在服务器上运行项目,而项目直接部署在http://myServerName。当我将应用程序部署到位于不同虚拟目录下的服务器上的各种环境时,问题就开始了。例如:http://myServerName/QaEnviornment或http://myServerName/TestEnviornment 问题是,对应用程序URL的所有Javascript调用都会忽略我的环境虚拟目录并失败。 例

我的ASP.NETMVC项目有一个奇怪的路由问题,希望你们能帮我解决

总的来说,当我在本地主机上运行项目时,或者在服务器上运行项目,而项目直接部署在
http://myServerName
。当我将应用程序部署到位于不同虚拟目录下的服务器上的各种环境时,问题就开始了。例如:
http://myServerName/QaEnviornment
http://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
。相反,它返回为
http://myServerName/ControllerName/ActionMethodName
当然失败了

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


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

不必总是记住正确构造它们,而是创建一个帮助函数,您可以调用它来创建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>
在你的主视图中

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

但这只有在Javascript代码内置于视图内部时才有效,对吗?如果脚本存储在附带的外部.js文件中,那么该文件将无法使用,是吗?谢谢你的回复!是的-如果您将上面的函数(它是JS而不是c#)放在外部JS文件中,它在任何地方都可用。您可以像调用任何其他JS函数一样调用它。注意->这不进入document.ready类型处理程序,而是独立的。
<script type="text/javascript">
   myGlobalFolderVar = '@ConfigurationManager.AppSettings["folderLocation"]'
</script>
<script type="text/javascript">
    myGlobalFolderVar = '@Url.Content("~/")'
</script>
var myUrl = CreateUrl('/ControllerName/ActionMethodName/');
$.ajax({url:myUrl,success:function(){Do stuff} });