Как получить базовый 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.hostname
(и location.host
), они отлично работают, когда я просматриваю свой сайт через визуальную студию, но когда я размещаю его в IIS, я получаю http://localhost
,/MyApp усечен.
Ответы
Ответ 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. Это сработало для меня.