Относительный 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, прежде чем я смогу установить приложение на производство.
Я уверен, что мне не хватает элементарной вещи, чтобы упростить это.
Спасибо
Ответы
Ответ 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
создайте новый сайт, подобный этому, выберите сайты, щелкните правой кнопкой мыши и создайте новый сайт.
![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
. Я постарался сделать приведенный ниже пример как можно более простым.