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

Относительный URL-адрес в JQuery Post Call

У меня следующая ситуация.

Я разработал свое первое приложение MVC Asp.Net. он запускается на моем сервере по следующему адресу

http://localhost:59441/

Я написал несколько методов JQuery Post, которые выглядели так:

  $.ajax({
        type: "POST",
        url: "/CeduleGlobale/UpdateCheckBox", ...

CeduleGlobale - мое имя_контроллера а также UpdateCheckBox - это мое имя метода

Когда я помещаю приложение на testServer, он был помещен в VirtualDirectory

поэтому приложение теперь

http://testServer/JprApplication/

больше не указывается порт, а также имя приложения

Когда я начал тестировать, я быстро заметил, что мои вызовы JQuery Post больше не работают...

Я изменил их, так что теперь URL-адрес

/JprMvc/CeduleGlobale/UpdateCheckBox

проблема в 2 раза.

  • это затрудняет тестирование на моей машине разработки, потому что IIS Express не позволяет мне указывать виртуальный каталог.
  • Мне не нравится hardCoding имя виртуального каталога в JQuery, потому что я не знаю, какое имя будет иметь приложение в рабочей среде, и поэтому мне придется изменить мой script, прежде чем я смогу установить приложение на производство.

Я уверен, что мне не хватает элементарной вещи, чтобы упростить это.

Спасибо

4b9b3361

Ответ 1

В зависимости от того, где вы на самом деле располагаете свой JavaScript (внутри представления или отдельного файла JS), у вас есть несколько вариантов.

Вариант 1 - Внутри представления

Просто используйте Html Helpers для создания ссылок для вас.

<script type="text/javascript">
   $(function(){
        $.ajax({
           type: "POST",
           url: "@Url.Action("UpdateCheckBox", "CeduleGlobale")"
        });
   });
</script>

Вариант 2 - Автономный JS файл

Обычно у нас есть функция на странице, которая устанавливает эти обработчики страниц. Итак, мы можем сделать что-то вроде следующего:

Вид

<script type="text/javascript">
    $(function(){
        SetOrderPage('@Url.Action("UpdateCheckBox", "CeduleGlobale")');
    });
</script>

Автономный JS файл

function SetOrderPage(ajaxPostUrl){
       $.ajax({
           type: "POST",
           url: ajaxPostUrl
       )};
}

Вариант 3 - Автономный JS файл Метод 2

У вас может быть глобальная переменная в вашем JS файле, который является siteroot. Обратный вывод здесь состоит в том, что вам нужно будет вручную создать каждый из ваших путей метода действия. На каждой странице вы можете установить глобальную переменную root сайта как таковую:

Автономный JS файл

var siteRoot;

Вид

<script type="text/javascript">
    siteRoot = '@Request.ApplicationPath';
</script>

Помните, что синтаксис Razor нельзя использовать в отдельном JS файле. Я считаю, что лучше всего позволить Razor/MVC/.NET динамически давать вам путь к сайту или маршрут URL, поскольку он действительно сократит ошибки, которые могут быть сделаны при перемещении между сайтами/виртуальными каталогами.

Ответ 2

Насколько я знаю, нет другого пути. Если вы не согласны с относительным URL-адресом пользователя то есть:

$.ajax({
        type: "POST",
        url: "./CeduleGlobale/UpdateCheckBox", ...

Но это может быть беспорядочным по разным причинам, когда вы используете рефакторинг. Альтернативно добавьте URL-адрес, который определяется глобально, и поэтому вам нужно только изменить его в месте, прежде чем перейти к производству.

то есть.

//Globally defined serverRoot
serverRoot = "http://someaddress/somevirtualdirectory";

$.ajax({
        type: "POST",
        url: serverRoot + "/CeduleGlobale/UpdateCheckBox", ...

Таким образом, если вам это не нужно, вы можете просто установить serverRoot = '';, и все вернется к тому, как оно теперь.

Ответ 3

У меня была такая проблема на MVC 5 с использованием JQuery, поэтому я пошел к этому решению, которое избавляется от проблемы, когда вы находитесь в Localhost, и в любом Navigator, даже когда вы развертываете приложение во вложенной папке.

var pathname = window.location.pathname;
var VirtualDirectory;
if (pathname.indexOf("localhost") >= 0 && pathname.indexOf(":") >= 0) {
    VirtualDirectory = "";
}
else {
    if ((pathname.lastIndexOf('/')) === pathname.length + 1) {
        VirtualDirectory = pathname.substring(pathname.indexOf('/'), pathname.lastIndexOf('/'));
    } else {
        VirtualDirectory = pathname;
    }
}

И затем в любом вызове ajax:

$.post(VirtualDirectory + "/Controller/Action", { data: data}, "html")
             .done(function (result) {
                 //some code             
});

Ответ 4

Pass @Url.Action( "действие", "контроллер" ) на javascript из представления. Это позволит динамически обновляться во время выполнения.

<script>
   myJavascriptfunction(@Url.Action("action","controller"),param1,param2);
</script>

Может существовать функция для получения корневого пути, который вы могли бы использовать для инициализации корневых переменных в предыдущих ответах.

Ответ 5

Я знаю, что это старый пост. Но у меня была такая же проблема, и я оказался здесь. И удалось исправить эту проблему с помощью UrlHelper.Action. Его следует использовать примерно так. (Обратите внимание, что это конкретное решение будет работать в представлении.)

url: "@Url.Action("UpdateCheckBox", "CeduleGlobale")",

Надеюсь, это поможет.:)

Ответ 6

http://localhost:59441/ и
http://testServer/JprApplication/ будет работать с вашим

$.ajax({ type: "POST", url: "/CeduleGlobale/UpdateCheckBox",...

если ваш хостинг в iis вам просто нужно создать виртуальный хост в вашем
C:\Windows\System32\drivers\etc\hosts

файл. Добавьте эту строку внизу вашего файла hosts

127.0.0.1 CeduleGlobale

create a new site like so создайте новый сайт, подобный этому, выберите сайты, щелкните правой кнопкой мыши и создайте новый сайт.

fill in your details and set the same hostname as you created above 'CeduleGlobale'

заполните свои данные и установите то же имя хоста, которое вы создали выше "CeduleGlobale"

затем разверните приложение MVC на этом сайте

Ответ 7

Ответ @Tommy был отличным указателем, однако для.NET Core мне пришлось делать вещи немного по-другому, так как объект Request имеет разные свойства.

Все было сделано сложнее, развернув виртуальный каталог, но используя IIS Express для разработки; следовательно, оператор if при установке базового 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" + "/";
    </script>
}
else
{
   /* DEBUG - no virutal directory, e.g. IIS Express */
    <script>
        window.siteRoot = "@Context.Request.Scheme" + "://" + "@Context.Request.Host.Value" + "/";
    </script>
}

Тогда из любого файла JavaScript

/* 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
    }
});

Очевидно, вы можете создать свое собственное пространство имен или что-то, чтобы сохранить загрязняющее window. Я постарался сделать приведенный ниже пример как можно более простым.