3lo*_*okh 5 ajax post relative-path asp.net-mvc-3
我有一个用单独的".js"文件写的Ajax帖子调用,我在多个页面中调用它.我的代码看起来像这样:
$.ajax({
url: '/MyVirtualDirectory/Controller/Action',
type: 'POST',
dataType: 'json',
....
....
})
Run Code Online (Sandbox Code Playgroud)
每次我更改服务器中的虚拟目录时,我都需要更改"URL"中的代码以使我的Ajax调用正常工作.
是否有任何方法可以使我的代码独立于IIS中的"虚拟目录"名称?
我的应用程序是MVC3.
dkn*_*ack 14
你应该使用这种Url.Action方法.但在你的情况下,一个单独的js文件,你无法访问此方法.所以我会为你视图中的每个网址创建一个javascript变量.然后你可以在你的js文件中使用这个变量.
UrlHelper.Action方法 - 生成操作方法的完全限定URL.
你的观点
<script type="text/javascript">
var myUrl = '@Url.Action("actionName", "controllerName")';
</script>
<script type="text/javascript" src="yourJsFile.js"/>
Run Code Online (Sandbox Code Playgroud)
你的js文件
$.ajax({
url: myUrl,
....
})
Run Code Online (Sandbox Code Playgroud)
另一种方法是将您的URL存储在视图中的隐藏字段中,并获取js文件中的隐藏字段值.
我终于找到了部分解决方法。在我的 .js 文件中,我做了一些像这样的肮脏编码:
var Path = location.host;
var VirtualDirectory;
if (Path.indexOf("localhost") >= 0 && Path.indexOf(":") >= 0) {
VirtualDirectory = "";
}
else {
var pathname = window.location.pathname;
var VirtualDir = pathname.split('/');
VirtualDirectory = VirtualDir[1];
VirtualDirectory = '/' + VirtualDirectory;
}
$.ajax({
url: VirtualDirectory/Controller/Action,
....})
Run Code Online (Sandbox Code Playgroud)
基本思想是检查 localhost 和端口号的 URL。如果两者都存在,则意味着我正在本地计算机中进行调试,因此我不需要 URL 中的虚拟目录。如果我运行托管版本,那么我的 URL 中不会有本地主机和端口号(假设我在端口 80 上托管)。
通过这种方式,当我在本地计算机上运行时调试时,URL 将仅为 Controller/Action,而当我托管时,URL 将是 VirtualDirectory/Action/Controller。现在对我来说效果很好。
但如果还有其他简单的方法,请留言。