web-dev-qa-db-fra.com

Comment obtenir l'URL de base d'une application MVC à l'aide de javascript

Comment obtenir l'URL de base en utilisant javascript?

Par exemple, lorsque je navigue sur mon site à partir de visual studio et que mon URL est http://localhost:20201/home/index, j'aimerais obtenir http://localhost:20201

Si j'héberge mon site sur IIS et que mon nom de répertoire virtuel est MyApp et que l'URL est http://localhost/MyApp/home/index, j'aimerais obtenir http://localhost/MyApp.

J'ai essayé d'utiliser location.protocol + location.hostname (et location.Host), ils fonctionnent correctement lorsque je navigue sur mon site via visual studio, mais lorsque je l'héberge sur IIS, je reçois http://localhost, le/MonApp est tronqué.

27
Null Reference

Vous devez éviter cette détection en JavaScript et transmettre à la place la valeur du code .NET. Vous risquerez toujours de rencontrer des problèmes avec des URL telles que http://server/MyApp/MyApp/action où vous ne pouvez pas savoir quel est le nom d'un contrôleur et quel est le chemin d'accès à l'application.

Dans votre fichier Layout.cshtml (ou partout où vous en avez besoin), ajoutez le code suivant:

<script type="text/javascript">
    window.applicationBaseUrl = @Html.Raw(HttpUtility.JavaScriptStringEncode(Url.Content("~/"), true));
    alert(window.applicationBaseUrl + "asd.html");

    // if you need to include Host and port in the url, use this:
    window.applicationBaseUrl = @Html.Raw(HttpUtility.JavaScriptStringEncode(
        new Uri(
                   new Uri(this.Context.Request.Url.GetLeftPart(UriPartial.Authority)),
                   Url.Content("~/")
               ).ToString(), true));
    alert(window.applicationBaseUrl + "asd.html");
</script>

La partie new Uri() est nécessaire pour que l'URL soit toujours correctement combinée (sans vérifier manuellement si chaque partie commence ou se termine par le symbole /).

31
Knaģis
var url = window.location.href.split('/');
var baseUrl = url[0] + '//' + url[2];
2
vijay

Je ne pense pas que cela soit possible car JavaScript (le client) ne sait rien de votre déploiement (MyApp) et le traite comme faisant partie de pathinfo (comme/home/index). Pour résoudre ce problème, vous pouvez essayer d'interpréter pathinfo (location.pathname) en fonction du domaine ou du port.

Mais vous pouvez définir une variable JavaScript dans une étendue globale (ou ce qui vous convient le mieux) contenant le chemin d'accès (celui-ci est généré par le serveur et placé dans la variable).

Cela pourrait ressembler à quelque chose comme ça dans votre tête HTML:

<script type="text/javascript">
    var global_baseurl = '<insert server side code that gets the path depending on your server side programming language>';
</script>
2
Werzi2001

Essayez le code ci-dessous.

function getBaseURL() {
    var url = location.href;  // entire url including querystring - also: window.location.href;
    var baseURL = url.substring(0, url.indexOf('/', 14));


    if (baseURL.indexOf('http://localhost') != -1) {
        // Base Url for localhost
        var url = location.href;  // window.location.href;
        var pathname = location.pathname;  // window.location.pathname;
        var index1 = url.indexOf(pathname);
        var index2 = url.indexOf("/", index1 + 1);
        var baseLocalUrl = url.substr(0, index2);

        return baseLocalUrl + "/";
    }
    else {
        // Root Url for domain name
        return baseURL + "/";
    }

}



document.write(getBaseURL());

Merci,

Shiva

1
SivaRajini
var base_url = "@Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"

Définissez-le dans le fichier de mise en page et ajoutez base_url. Cela a fonctionné pour moi.

0
Prince Prasad

Vous pouvez définir une URL de base dans la balise head de votre page. Tous les liens/hrefs l'utiliseront pour appeler relative hrefs.

@{ var baseHref = new System.UriBuilder(Request.Url.AbsoluteUri) { Path = Url.Content("~/") }; }
<base href="@baseHref" />

Explication:

  • Url.Content ("~ /") renvoie le chemin relatif (dans ce cas, MyApp sur le serveur).
  • new System.UriBuilder (Request.Url.AbsoluteUri) crée un UriBuilder contenant les informations de port et de protocole.
0
E. Mourits

Je pense qu'une solution propre sera comme

Mettre l'URL de base dans le _layout Html comme suit

<div id="BaseUrl" data-baseurl="@Context.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"></div>    

(Context.Request.Url.GetLeftPart (UriPartial.Authority)) vous donnera en

local http: // localhost: 20201 de IIS vous donnera http: // localhost

(Url.Content ("~ /")} dans le local sera vide mais dans IIS vous donnera le nom de l'application, dans votre cas MyApp

Puis du Js:

var baseUrl = $("#BaseUrl").data("baseurl");

Que vous puissiez Utilisez-le Comme:

$.getJSON(baseUrl + "/Home/GetSomething", function (data) {
      //Do something with the data
});

https://msdn.Microsoft.com/en-us/library/system.uri.getleftpart(v=vs.110).aspxhttp://api.jquery.com/data/

0
HB MAAM