2013-04-27 9 views
12

Ich benutze JavaScript-Code, um eine MVC-Web-API aufzurufen. Es funktioniert gut, wenn der Strompfad ist:MVC "~" Pfad in Javascript

http://localhost/myApp/Administrator

aber es funktioniert nicht, wenn Strompfad ist:

http://localhost/myApp/Administrator/

ich den Fehler The resource cannot be found bekommen. Unten ist der Code:

$.getJSON("api/UserApi", 
    function (data) { 
     ...    
    }); 

Ich will nicht eine absolute URL im Code verwenden, z.B .:

$.getJSON("http://localhost/myApp/api/UserApi",   
    function (data) { 
     ...  
    }); 

Die absolute URL in Ordnung funktioniert, aber es fehlt die Flexibilität. Gibt es eine Möglichkeit, dasselbe wie unten zu tun?

$.getJSON("~/api/UserApi",   
    function (data) { 
     ... 
    }); 

ASP.NET den Austausch der Zeichen "~" mit der aktuellen Anwendung Root-Pfad unterstützt, zB:

http://localhost/myApp

jedoch das Zeichen "~" ist nicht in JavaScript-Dateien unterstützt . Wie erreiche ich das Gleiche?

Das JavaScript befindet sich in einer eigenständigen Datei, die keine ASP.NET-Anweisungen wie Url.Content verwenden kann. Gibt es einen besseren Weg, es zu tun?

Ich habe die folgende Methode gefunden. Gibt es bessere Lösungen ?:

1) Schreiben Sie den Code unten in einer .cshtml Datei

2) Lesen Sie die currentDomain Variable aus der J-Datei:

$.getJSON(currentDomain + "/api/UserApi",   
    function (data) { 
     ...   
}); 

Antwort

13

Wenn Sie versuchen, Link zu einer Aktion zu erhalten, können Sie definieren Sie in Ihrer Ansicht variales, die mit Url.Action bevölkert werden:

<script type="text/javascript"> 
    var userApiPath = '@(Url.Action("userApi", "api"))'; 
</script> 

Und später diese Variable in Ihrer JS-Datei verwenden:

$.getJSON(userApiPath,   
    function (data) { 
}); 

Wenn Sie einen allgemeinen Weg zu Ihrer App möchten, können Sie so etwas tun:

<script type="text/javascript"> 
    var path = '@(string.Format("{0}://{1}{2}", 
       Request.Url.Scheme, 
       Request.Url.Host, 
       (Request.Url.IsDefaultPort) ? "" : string.Format(":{0}", 
       Request.Url.Port)))'; 
</script> 

Und später verwenden Sie diese Variable irgendwo in Ihren JS-Dateien. Natürlich müssen Sie dafür nicht string.Format verwenden, das ist nur ein Beispiel.

EDIT:

Sie können sich auch RazorJS verwenden.

+0

Link zu Rasiermesser funktioniert nicht mehr – Alok

2

Sie haben versuchte die URL helper? Es ermöglicht Ihnen, eine vollständig qualifizierte URL für Ihren Controller/Aktion zu erzeugen, wie solche:

@Url.Action("Index", "Home", etc...) 

Referenz: MSDN

UPDATE
ich bemerkt, dass Sie das Schreiben dynamischen URLs in Ihre Js Bezug wurden Datei. Sie sollten URLs nicht fest in Ihre Skripts codieren, da dies die Pflege Ihres Codes erschwert. Was passiert, wenn Sie morgen die Domains ändern und vergessen, URLs in einer der Skriptdateien zu ändern? Sie sollten die URL als Parameter für Ihre JS-Funktion stattdessen von Ihrer .cshtml-Seite übergeben.

+0

Ja, ich will nicht zu Namen harten Code-Domain auf den. js-Datei, also möchte ich einen Weg finden, der wie das '~' char in der CSHTML-Datei, die automatisch das '~' char an die aktuelle Domain ersetzen kann, scheint es dort keine Möglichkeit, es in JS-Datei zu tun, so denke ich, dass ich habe Um den aktuellen Domainnamen jetzt aus der CSHtml-Datei zu erhalten, übergeben Sie ihn an js fi le. – sam

2
@Url.Action 

für die Javascript

@Url.Content 

für CSS und JS-Datei hinzufügen.

+1

Das Javascript ist in einer eigenständigen Datei, die die asp.net-Anweisung nicht verwenden kann, gibt es eine bessere Möglichkeit, es zu tun? – sam

0

in einer Ansicht Set Seite Url:

<script type="text/javascript"> 
    var PageUrl = '@Url.Action("Index","Home")'; 
</script> 

dann in einer js-Datei:

function MyFunc() { 
var $form = $('form[id="Form"]'); 
    $.ajax({ 
    type: 'GET', 
    url: PageUrl+"/MyActionName", 
    data: $form.serialize(), 
    cache: false, 
    error: function (xhr, status, error) { 

    }, 
    success: function (result) { 
     //do something 
    } 
}); 

}