CeduleGlobale ist mein ControllerName und UpdateCheckBox ist mein methodName
Als ich die Anwendung auf dem Testserver ablegte, wurde sie in ein virtuelles Verzeichnis gestellt
Daher ist die Anwendung jetzt
http://testServer/JprApplication/
keinen Port mehr angeben und auch einen Anwendungsnamen
Als ich mit dem Testen begann, bemerkte ich schnell, dass meine JQuery-Post-Aufrufe nicht mehr funktionierten …
Ich habe sie so geändert, dass jetzt die URL lautet
/JprMvc/CeduleGlobale/UpdateCheckBox
das problem ist 2 fach.
Dies erschwert das Testen auf meinem Entwicklungscomputer, da IIS Express es mir nicht erlaubt, ein virtuelles Verzeichnis anzugeben.
Ich mag es nicht, den Namen des virtuellen Verzeichnisses in JQuery fest zu codieren, da ich nicht weiß, welchen Namen die Anwendung in der Produktionsumgebung haben wird, und daher muss ich mein Skript ändern, bevor ich die Anwendung in der Produktion installieren kann.
Ich bin sicher, dass mir einige grundlegende Dinge fehlen, um dies zu vereinfachen.
Vielen Dank
Tommy
Je nachdem, wo sich Ihr JavaScript tatsächlich befindet (innerhalb der Ansicht oder einer separaten JS-Datei), haben Sie einige Optionen.
Option 1 – In der Ansicht
Verwenden Sie einfach die HTML-Helfer, um die Links für Sie zu generieren
function SetOrderPage(ajaxPostUrl){
$.ajax({
type: "POST",
url: ajaxPostUrl
)};
}
Option 3 – Eigenständige JS-Datei Methode 2
Sie könnten eine globale Variable in Ihrer JS-Datei haben, die das Siteroot ist. Der Nachteil dabei ist, dass Sie jeden Ihrer Aktionsmethodenpfade von Hand erstellen müssen. Auf jeder Seite könnten Sie die globale Site-Root-Variable wie folgt festlegen:
Denken Sie daran, dass Sie die Razor-Syntax nicht in einer eigenständigen JS-Datei verwenden können. Ich glaube, dass es am besten ist, Razor/MVC/.NET Ihnen den Site-Pfad oder die URL-Route dynamisch geben zu lassen, da dies wirklich die Fehler reduziert, die beim Wechseln zwischen Sites/virtuellen Verzeichnissen gemacht werden könnten.
Ich persönlich bin kein Fan von Routennamen, es sei denn, sie sind wirklich kompliziert. Meistens interessiere ich mich nur für einen einfachen Controller / eine einfache Aktion, also verwende ich stattdessen Url.Action (“MyAction”, “MyController”).
– Vitalität
16. Oktober 2014 um 15:11 Uhr
Danke, aber zu Option 3: Ziemlich sicher, dass Sie nicht verwenden möchten Server.MapPath da dies das physische Verzeichnis verfügbar macht, das diesem virtuellen Pfad zugeordnet ist. Sie wollten wahrscheinlich verwenden Request.ApplicationPath Dies wird normalerweise verwendet, um zur Laufzeit eine „Approot“-Zeichenfolge zur Verwendung durch JS-Methoden zu generieren (insbesondere für COTS-Produkte, bei denen der App-Name nicht fest codiert werden kann).
– nichts ist nötig
9. März 2017 um 0:12 Uhr
Option 3 – Anstatt @Request.ApplicationPath in jede einzelne Ansicht zu schreiben, schreiben Sie es einfach einmal in Ihre _Layout.cshtml (oder eine beliebige „Master“-Seite). Jetzt haben Sie eine globale Variable, die für alle Ihre JS-Dateien verfügbar ist.
– Dimsky
2. Februar 2018 um 21:42 Uhr
Soweit ich weiß, gibt es keine andere Möglichkeit, dies zu umgehen. Es sei denn, Sie sind bereit, relative URLs zu verwenden, dh:
Aber das kann aus verschiedenen Gründen chaotisch werden, wenn Sie Code umgestalten. Alternativ können Sie die global definierte URL voranstellen und müssen sie dann nur an einer Stelle ändern, bevor Sie in die Produktion gehen.
Auf diese Weise können Sie es einfach einstellen, wenn Sie es nicht benötigen serverRoot=""; und alles wird wieder so sein, wie es jetzt ist.
Erster Teil funktioniert nicht. Zweiter Teil scheint zu funktionieren. Danke
– Gelassenheit jetzt
20. August 2013 um 14:56 Uhr
Ja, die erste Option funktioniert nur, wenn die Seite, die sie aufruft, relativ zum Serverstamm ist. Relative URLs bereiten bestenfalls Kopfschmerzen und daher würde ich aus vielen Gründen nur meinen zweiten Vorschlag oben wirklich empfehlen!
– Rob Schmuecker
20. August 2013 um 15:02 Uhr
Anstatt von "./CeduleGlobale… du brauchst vielleicht window.location.pathname + "/CeduleGlobale… wenn Sie erweiterungslose URLs verwenden
– Chris Marisic
31. Mai 2016 um 18:05 Uhr
Im Wesentlichen ist dies die bevorzugte Lösung (zweiter Teil), aber -1 für die Hardcodierung der serverRoot Pfad, und auch für die Hardcodierung des Protokolls (http). Empfehlen Sie stattdessen zu verwenden Request.ApplicationPath und diese Variable an JS ausgeben. Wenn Sie dann Ihren Protokoll-, Host- und Anwendungsnamen ändern, müssen Sie nicht jede verdammte Datei ändern, die definiert serverRoot
– nichts ist nötig
9. März 2017 um 0:16 Uhr
Ich hatte dieses Problem auf MVC 5 mit JQuery, also bin ich zu dieser Lösung gegangen, die das Problem beseitigt, wenn Sie sich in Localhost befinden, und in jedem Navigator, selbst wenn Sie eine App in einem Unterordner bereitstellen.
var pathname = window.location.pathname;
var VirtualDirectory;
if (pathname.indexOf("localhost") >= 0 && pathname.indexOf(":") >= 0) {
VirtualDirectory = "";
}
else {
if ((pathname.lastIndexOf("https://stackoverflow.com/")) === pathname.length + 1) {
VirtualDirectory = pathname.substring(pathname.indexOf("https://stackoverflow.com/"), pathname.lastIndexOf("https://stackoverflow.com/"));
} else {
VirtualDirectory = pathname;
}
}
Ich weiß, das ist ein alter Beitrag. Aber ich hatte das gleiche Problem und bin hier gelandet. Und es geschafft, dieses Problem mit zu beheben UrlHelper.Action Methode. Es sollte so etwas verwendet werden. (Beachten Sie, dass diese spezielle Lösung innerhalb der Ansicht funktioniert.)
Möglicherweise gibt es eine Funktion zum Abrufen des Stammpfads, mit der Sie die Stammvariablen in den vorherigen Antworten initialisieren können.
@ Tommys Antwort war ein großartiger Hinweis, aber für .NET Core Ich musste die Dinge ein wenig anders machen, als die Request Objekt hat unterschiedliche Eigenschaften.
Die Dinge wurden komplizierter, indem sie in einem virtuellen Verzeichnis bereitgestellt, aber IIS Express für die Entwicklung verwendet wurden. daher die if -Anweisung beim Festlegen der Basis-URL.
Shared/_Layout.cshtml
<!-- Set the site root for javascript in _Layout.cshtml.-->
@if (!String.IsNullOrWhiteSpace(@Context.Request.PathBase.Value))
{
/* LIVE - includes virtual directory */
<script>
window.siteRoot = "@Context.Request.Scheme" + "://" + "@Context.Request.Host.Value" + "@Context.Request.PathBase.Value" + "https://stackoverflow.com/";
</script>
}
else
{
/* DEBUG - no virutal directory, e.g. IIS Express */
<script>
window.siteRoot = "@Context.Request.Scheme" + "://" + "@Context.Request.Host.Value" + "https://stackoverflow.com/";
</script>
}
Dann aus einer beliebigen JavaScript-Datei
/* from any javascript file */
var url = window.siteRoot + 'MySearch/GetMySearchResults';
$.ajax({
url: url,
type: 'GET',
cache: false,
data: searchObj,
success: function (result) {
alert('yatta!');
},
fail: function (e, k, n) {
alert('hmph!');
},
done: function() {
// hide spinner
}
});
Offensichtlich möchten Sie vielleicht Ihren eigenen Namensraum erstellen oder etwas, um Umweltverschmutzung zu vermeiden window. Ich habe versucht, das folgende Beispiel so einfach wie möglich zu halten.
Kudzai zishumba
http://localhost:59441/ und http://testServer/JprApplication/ werden beide mit Ihrem arbeiten