为什么url变量会导致ajax相对url出现问题?

时间:2016-03-16 13:23:27

标签: javascript jquery ajax relative-url

所以,我正在做这样一个普通的ajax调用:

$.ajax({
    type: "GET",
    url: this.Controller + "/" + this.Action,
    data: data,
    cache: false,
    dataType: "json",
    success: function (data) {
        var json = $.parseJSON(data);
        $("#Debug").html(JSON.stringify(json, undefined, 4));
    },
    error: function (jqXHR, textStatus, errorThrown) {
        var errorMessage = "Unable to retrieve data."
        if (jqXHR.responseText != null) {
            errorMessage += "\n\nError Message: " + jqXHR.responseText;
        }
        alert(errorMessage);
    }
});

当我使用ajax url的相对路径时,只要当前页面的url中没有url变量,它就可以正常工作。它会正确转到http://domain.com/controller/action

如果有url变量,则ajax url会尝试点击http://domain.com/controller/controller/action,但不存在。

如果我添加这样的斜杠:

url: "/" + this.Controller + "/" + this.Action

这解决了url变量导致的问题,但仅限于本地。当我部署到我们的服务器时,我的应用程序位于子目录中,因此网址为http://domain.com/myapp。斜杠解决方案不起作用,因为根是http://domain.com而不是http://domain.com/myapp

2 个答案:

答案 0 :(得分:0)

你可以尝试这个$.ajax({url: document.domain + this.Controller ... })

答案 1 :(得分:0)

我通过JS尝试了各种方法来实现这一点,但它们都不适用于服务器(带子目录)和本地(不带)。

所以,我的解决方案是在我的web.config的appsettings中添加子目录的名称。在主web.config中,我有:<add key="Subdirectory" value="" />

在web.release.config中,我有:<add key="Subdirectory" value="SubDirectoryName" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />

将其留在web.config中并将其设置为web.release.config中,子目录将仅在发布到服务器时进行转换和设置。

在_Layout.cshtml页面上,我有:

<script> var subdirectory = '@ConfigurationManager.AppSettings["Subdirectory"]'; if (subdirectory != '') { subdirectory = '/' + subdirectory; } </script>

然后,在我的JS的任何地方,我正在尝试进行ajax调用,我将url设置为:

url: subdirectory + "/" + this.Controller + "/" + this.Action, // subdirectory comes from _Layout.cshtml