我的ASP.NET MVC项目存在一个奇怪的路由问题,我希望你们可以帮助我。
总体而言,当我在本地主机上运行项目或在服务器上运行项目时,一切正常,直接部署在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
。相反,它会回来as http://myServerName/ControllerName/ActionMethodName
并且当然会失败。
为了解决这个问题,我现在声明了一个包含环境文件夹名称的全局Javascript变量,当我为javascript调用构建URL时,我必须记住将它们构造为var myUrl = myGlobalFolderVar + '/ControllerName/ActionMethodName/'
使用全局JavaScript变量来解决这个问题对我来说似乎是一个糟糕的解决方案。有什么办法可以让路由正常工作,所以无论何时进行JavaScript调用,运行应用程序的子文件夹总是包含在URL中?
答案 0 :(得分: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} });