Подтвердить что ты не робот

Как получить базовый URL-адрес приложения MVC с помощью javascript

Как получить базовый URL-адрес с помощью javascript?

Например, когда я просматриваю свой сайт из visual studio, и если мой URL http://localhost:20201/home/index, я бы хотел получить http://localhost:20201

Если я размещаю свой сайт в IIS, и если мое имя виртуального каталога - это MyApp, а URL-адрес http://localhost/MyApp/home/index, я хотел бы получить http://localhost/MyApp

Я попытался использовать location.protocol + location.hostnamelocation.host), они отлично работают, когда я просматриваю свой сайт через визуальную студию, но когда я размещаю его в IIS, я получаю http://localhost,/MyApp усечен.

4b9b3361

Ответ 1

Вам следует избегать такого обнаружения в JavaScript и вместо этого передавать значение из кода .NET. Вы всегда рискуете столкнуться с проблемами с URL-адресами, такими как http://server/MyApp/MyApp/action, где вы не можете знать, какое имя контроллера и какой путь к приложению.

В файле Layout.cshtml(или там, где вам это нужно) добавьте следующий код:

<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>

Часть new Uri() необходима, чтобы URL-адрес всегда был правильно скомбинирован (без ручной проверки, начинается ли каждая часть или заканчивается символом /).

Ответ 2

var url = window.location.href.split('/');
var baseUrl = url[0] + '//' + url[2];

Ответ 3

Я не думаю, что это возможно, поскольку JavaScript (Клиент) ничего не знает о вашем развертывании (MyApp) и рассматривает его как часть pathinfo (точно так же, как /home/index ). В качестве обходного пути вы можете попытаться интерпретировать pathinfo (location.pathname) в соответствии с доменом или портом.

Но вы можете установить переменную JavaScript в глобальной области (или что вам когда-либо подходит), содержащей путь (путь генерируется сервером и помещается в переменную).

Это может выглядеть примерно так в вашем html-Head:

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

Ответ 4

Попробуйте приведенный ниже код.

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());

Спасибо,

Шив

Ответ 5

Если вы используете .NET Core, вы можете получить URL-адрес, устанавливающий переменную JavaScript в глобальной области (например, в файле Layout.cshtml этот файл находится в папке Views/Shared):

 <script type="text/javascript">
    var url = '@string.Format("{0}://{1}{2}", Context.Request.Scheme, Context.Request.Host.Value , Url.Content("~/"))';
</script>

Из версии С# 6 с интерполяцией:

<script type="text/javascript">
    var url = '@($"{Context.Request.Scheme}://{Context.Request.Host.Value}{Url.Content("~/")}")';
</script>

Ответ 6

Вы можете установить базовый url в теге head вашей страницы. Все ссылки /hrefs будут использовать это для вызова relatieve hrefs.

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

Пояснение:

  • Url.Content( "~/" ) возвращает относительный путь (в данном случае MyApp на сервере)
  • новый System.UriBuilder(Request.Url.AbsoluteUri) создает UriBuilder, который содержит информацию о порте и протоколе.

Ответ 7

Я думаю, что чистое решение будет похоже на

Поместите базовый URL-адрес в _layout Html, например,

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

Context.Request.Url.GetLeftPart(UriPartial.Authority) предоставит вам

local http://localhost:20201 из IIS предоставит вам http://localhost

Url.Content( "~/" ) в локальном будет пустым, но в IIS вы укажете имя приложения, в вашем случае MyApp

Затем из Js:

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

Чем вы можете Использовать его Нравится:

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

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

Ответ 8

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

Определите его в файле макета и добавьте base_url. Это сработало для меня.