web-dev-qa-db-ja.com

JavaScript Ajax呼び出しでの相対パスの問題

次の関数を含むJavaScriptファイルがあります。

function AskReason() {
    var answer = Prompt("Please enter a reason for this action:", "");
    if (answer != null)
        DoReason(answer);
}

function createXMLHttpRequest() {
    try {
        return new XMLHttpRequest();
    }
    catch (e)
    { alert('XMLHttpRequest not working'); }
    try {
        return new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    { alert('Msxml2.XMLHTT not working'); }
    try {
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e)
    { alert('Microsoft.XMLHTTP not working'); }
    alert("XMLHttpRequest not supported");
    return null;
}

function DoReason(reason) {
    var xmlHttpReq = createXMLHttpRequest();
    var url = "/Shared/AskReason.ashx?REASON=" + reason;
    xmlHttpReq.open("GET", url, true);
    xmlHttpReq.send(null);
}

この行:

    var url = "/Shared/AskReason.ashx?REASON=" + reason;

問題の原因は何ですか。

VS 2010ではアプリのデバッグ-この呼び出しは私のashxハンドラーに対して機能します。

プロジェクトを仮想ディレクトリに移動すると-例http://localhost/myapp

このコードは壊れ、JavaScriptを次のように変更する必要があります。

var url = "http://localhost/myapp/Shared/AskReason.ashx?REASON=" + reason;

これを修正して両方の環境で機能するようにする方法や、アプリをサーバーにデプロイするときに手動の変更を受け入れる方法についてのアイデアはありますか?

ありがとう、マイク

17
MDV2000

先のとがった方法 は機能しますが、どこに展開するかを事前に知っておく必要があります。

または、単に相対パスを/で始めないでください。

var url = "Shared/AskReason.ashx?REASON=" + reason;

現在のドキュメントの場所を基準にして解決されます。したがって、現在のドキュメントが次の場合:

http://localhost/myapp/index.aspx

...次に解決します

http://localhost/myapp/Shared/AskReason.ashx?REASON=foo
22
T.J. Crowder

「/」で始まるパス(プロトコルとホストなし)は、ホストのrootを基準にしています。アプリケーションが「http:// whatever/myapp」にあるようにデプロイする場合、ルート相対パスは「/ myapp」で始まる必要があります。

なんらかのページテンプレートメカニズムが関係するサーバー側環境で作業している場合、一般的なトリックは、パスのその部分をある種の構成変数にして、次のようなパスを持つページを作成できるようにすることです。

<a href='${root}/something/something'>click me</a>

次に、その「ルート」変数が構成に基づいて「/ myapp」などに展開されます。

6
Pointy

絶対URLが必要な同様の問題がありましたが、localhostから運用サーバーに移動すると参照が壊れました。 「localhost」文字列が次の場所に存在するかどうかを確認して解決しました。

var environ = window.location.Host;

次に、単に行うことができます:

if (environ === "localhost") {
    var baseurl = window.location.protocol + "//" + window.location.Host + "/" + "shared/";
} else {
    var baseurl = window.location.protocol + "//" + window.location.Host + "/";
}

次に、参照する必要のあるURLの前にbaseurlを追加できます。

3
chromaloop

URL

 var url = "/Shared/AskReason.ashx?REASON=" + reason; 

ルートディレクトリでファイルを探しています(絶対パスであるため)。

 http://localhost/Shared/AskReason.ashx 

仮想ディレクトリの名前を含める必要がありますOR適切な構造を決定します:

/なしで開始すると、相対パスが得られます。ディレクトリをナビゲートする必要がある場合は、../Shared /スタイルの表記を使用するか、最後にサーバーのDirectoryコマンドを使用して現在のパスを確認します。

2
iivel

別の.jsファイルでAJAXを呼び出すと、ASP.NET MVCで同じ問題が発生します。これは次のようになります。

 return $.ajax({
            type: "POST",
            url: '/Dashboard/Execute',
            contentType: "application/json; charset=utf-8",
            data: filter,
            dataType: "json",
        });

もちろん、これは私の地元ではうまくいきます。ただし、IISのサブディレクトリにデプロイすると、.

wwwroot/appsite/subdomainfolder/

これは404 Not Foundをトリガーします。これは、URLにサブドメインフォルダーが添付されなかったためです。

私が削除した場合

「/」

uRLの最初に、次のように生成されます。

http://localhost/subdomainfolder/Dashboard/Dashboard/ExecuteReader

これも404 Not Found問題を引き起こします。

だからここに私の回避策の2つのオプションがあります:

バックスラッシュを削除し、コントローラー(この場合はダッシュボード)の名前を削除します。

return $.ajax({
            type: "POST",
            url: '/Execute',
            contentType: "application/json; charset=utf-8",
            data: filter,
            dataType: "json",
        });

または、そのままにして、URLの先頭に2つのピリオドを追加するだけです。

return $.ajax({
            type: "POST",
            url: '../Dashboard/Execute',
            contentType: "application/json; charset=utf-8",
            data: filter,
            dataType: "json",
        });
1
Willy David Jr