Як атрымаць базавы URL прыкладання MVC з выкарыстаннем JavaScript

Як атрымаць базавы URL з дапамогай JavaScript?

E.g., When I browse my site from visual studio, and if my URL is http://localhost:20201/home/index, I would want to get http://localhost:20201

If I host my site on IIS, and if my virtual directory name is MyApp and the URL is http://localhost/MyApp/home/index, I would want to get http://localhost/MyApp

Я паспрабаваў з дапамогай location.protocol + location.hostnamelocation.host ), яны працуюць добра, калі я праглядаць мой сайт з дапамогай Visual Studio, але калі я размясціць яго на IIS, я атрымліваю HTTP://лакальны , то/MyApp абрэзанае прэч.

25
таму што мой сайт пабудаваны з выкарыстаннем ASP.NET MVC, і ён размешчаны на IIS з імем віртуальнага каталога
дададзена аўтар Null Reference, крыніца
Вы просіце Javascript, правільна? Што гэта трэба рабіць з ASP.NET, гэта структура MVC або IIS?
дададзена аўтар SimonSimCity, крыніца

7 адказы

Вы павінны пазбягаць такога выяўлення ў JavaScript і замест таго, каб перадаць значэнне з кода .NET. Вы заўсёды маеце рызыку нарвацца на праблемы з URLs як HTTP://сервер/MyApp/MyApp/дзеянне , дзе вы не можаце ведаць, што імя кантролера і які шлях да дадатку.

У вашым 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>

<�Код> новы Uri() частка неабходная, так што URL заўсёды камбінуецца правільна (без ручной праверкі, калі кожны пачынае частку або заканчваецца / сімвал).

27
дададзена
EDIT: добра толькі што бачыў ваш адрэдагаваны адказ
дададзена аўтар Null Reference, крыніца
Спрабаваў гэта на размешчаным дадатку IIS, ён паказвае HTTP://лакальнага без/MyApp. Я не хачу, каб жорстка кадаваць «/ MyApp» частка
дададзена аўтар Null Reference, крыніца
Добра, гэта працуе, памылка з майго боку, дзякуй!
дададзена аўтар Null Reference, крыніца
калі вам патрэбен абсалютны шлях (уключаючы хост і порт, см мой абноўлены адказ)
дададзена аўтар Knaģis, крыніца
працуе для мяне :), што гэта выхад для ўсяго Url.Content ( "~/asd.html") у кодзе .NET? <�Код> Url.Content() убудаваны ў метад, які вырашае /MyApp частку.
дададзена аўтар Knaģis, крыніца

Паспрабуйце код ніжэй.

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

дзякуй,

Сіва

2
дададзена
Ці з'яўляецца гэта фіксаваная на лакальны толькі? Калі ён разгорнуты, людзі будуць атрымліваць доступ да дадатку праз IP-адрас
дададзена аўтар Null Reference, крыніца

Я не думаю, што гэта магчыма, як JavaScript (кліент) нічога не ведае пра разгортванне (MyApp) не ведае і разглядае яго як частка Pathinfo (гэтак жа, як/дома/індэкс). У якасці часовага рашэння можна паспрабаваць інтэрпрэтаваць Pathinfo (location.pathname) у адпаведнасці з даменам або порту.

Але вы можаце ўсталяваць пераменную JavaScript ў глабальным маштабе (або тое, што калі-небудзь вам пасуе), які змяшчае шлях (шлях генеруецца серверам і змяшчаецца ў зменную).

Гэта можа выглядаць прыкладна так, што ў вашым HTML-Head:

<script type="text/javascript">
    var global_baseurl = '';
</script>
2
дададзена
var url = window.location.href.split('/');
var baseUrl = url[0] + '//' + url[2];
2
дададзена
Гэта па-ранейшаму дае мне лакальны пры размяшчэнні на IIS
дададзена аўтар Null Reference, крыніца
Добрыя і кампактныя і вырашыць маю праблему. Дзякуй!
дададзена аўтар JohnK, крыніца
На самай справе гэта адзін трохі лепш: stackoverflow.com/a/11775016/1431728 .
дададзена аўтар JohnK, крыніца

Я думаю, што чыстае рашэнне будзе як

Putting the base URL in the _layout Html like so

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

Context.Request.Url.GetLeftPart(UriPartial.Authority) will give you in

local http://localhost:20201 from IIS will give you http://localhost

Url.Content("~/") in the local will be empty but in IIS will give you the app name, in your case 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/

0
дададзена

Вы можаце ўсталяваць базавы URL у тэг вашай старонкі. Усе спасылкі/hrefs будзе выкарыстоўваць гэта, каб патэлефанаваць relatieve hrefs.

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

тлумачэнне:

  • Url.Content("~/") returns the relative path (in this case MyApp on the server)
  • new System.UriBuilder(Request.Url.AbsoluteUri) creates an UriBuilder that contains port and protocol information
0
дададзена
var base_url = "@Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")"

Вызначыць яго ў файл макета і дадаць base_url. Гэта працуе для мяне.

0
дададзена