说我有这个网站 http://localhost/virtual 其中virtual是虚拟目录
我有一个使用JQuery在javascript文件中定义的Ajax请求
$.getJSON("/Controller/Action")
调用此方法时,客户端会尝试在根级别找到该网址,即 http://localhost/Controller/Action
如果我添加波浪号(〜)符号,它将变为 http://localhost/virtual/~/Controller/Action
它应该(如果它是我想要的那样)决心 http://localhost/virtual/Controller/Action
有关如何解决此问题的任何想法?
答案 0 :(得分:24)
阿库的上面的暗示看起来没错,但它不想为我工作。最后我想出来像这样使用它
<script type="text/javascript">
var config = {
contextPath: '<%= @Url.Content("~") %>'
};
</script>
然后在我的JavaScript中我像这样使用它
config.contextPath +'myAppPath“。
因此,如果没有虚拟目录,则解析为 “/”+“myAppPath” 如果是虚拟目录,则解析为 “/ VirtualPath /”+ +“myAppPath”
这最终对我有用。
答案 1 :(得分:15)
我成功使用了此解决方案
将以下元素放在母版页
中<%= Html.Hidden("HiddenCurrentUrl", Url.Action("Dummy"))%>
在主javascript文件中声明一个全局变量
var baseUrl = "";
加载javascript时将baseUrl设置为“HiddenCurrentUrl”的值
baseUrl = $("#HiddenCurrentUrl").val();
baseUrl = baseUrl.substring(0, baseUrl.indexOf("Dummy"));
使用baseUrl
$.getJSON(baseUrl + "Action")
编辑改进的解决方案
在您的控制器中
ViewBag.BaseUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath + "/";
在您的母版页
<script type="text/javascript">
var YourNameSpace = YourNameSpace || {};
YourNameSpace.config = {
baseUrl: "@ViewBag.BaseUrl"
}
</script>
使用您的baseUrl
$.getJSON(YourNameSpace.config.baseUrl + "Action")
答案 2 :(得分:4)
获取基本网址的另一种方法是
<script type="text/javascript">
window.g_baseUrl = '@Url.Content("~")';
</script>
例如,如果您从 SomeName 虚拟目录运行应用程序,那么 window.g_baseUrl 变量将等于 / SomeName /
此方法的好处是能够在其他控制器中调用操作,如此
$.getJSON(window.g_baseUrl + "AnotherController/Action")
答案 3 :(得分:2)
也许,$.getJSON("Controller/Action")
会做什么?
答案 4 :(得分:2)
应用程序根路径的波形符快捷方式是ASP.NET的一项特殊功能,不是URL本身的一部分。因此,尝试在JavaScript中使用带有代字号的网址无法解析网站根目录,它只会为您提供文字~
,如您所见。
您需要将应用程序根路径的值传递给JavaScript,以便它自己构建URL。我对ASP.NET并不熟悉,但我相信你可以这样做:
<script type="text/javscript">
var approot= <%= JavaScriptSerializer.Serialize(Request.ApplicationPath) %>;
... $.getJSON(approot+'/Controller/Action') ...;
</script>
如果您知道页面上有关于该批准的链接,那么更简单的方法是阅读该链接的href
:
var approot= $('#homepagelink').attr('href');
答案 5 :(得分:0)
JS文件的相对路径是我找到的唯一解决方案 $ .getJSON( “../控制器/动作”)
答案 6 :(得分:0)
我知道这个问题很老但我最近在努力解决这个问题并且能够使用
来解决它 url:'<%=VirtualPathUtility.ToAbsolute("~/Include/cntrols/Data.aspx") %>',
这在我的ajax电话中很有用......
答案 7 :(得分:0)
回答这个问题为时已晚。但由于我遇到同样的问题,可能对某些人有用。而不是执行上述答案中提到的所有这些步骤,更好的方法是使用
Url.Action('action','controller')
。
如果网址从虚拟目录运行,则会生成网址/VIRDIR/controller/action
,或者在其他情况下生成/controller/action
。