Как я должен создать относительные пути в JavaScript, используя MVC3? - PullRequest
2 голосов
/ 29 сентября 2011

У меня возникают трудности с выравниванием путей без использования жесткого кода в javascript. Я использую веб-приложение asp.net MVC3.

Если мой путь имеет форму

var url = 'http://serverNameHardcode/websiteNameHardcode/service/service?param1=' + param;

Тогда все работает нормально, когда я делаю

 $.get(url,
        {},
        function (data) {alert('callback success');},'json');

Я хотел бы создать относительный путь. Я пытался

var url = 'service/service?param1=' + param;

И это работает, когда я работаю локально, а также в Firefox, но не в IE7. Когда я публикую на сервер без жесткого кода, обратный вызов никогда не срабатывает. Я знаю, что MVC-3 добавляет сложности в маршрутизацию, но я не знаю, применимо ли это к этой ситуации; Итак, я пометил этот вопрос как таковой.

Как мне настроить свой путь, чтобы мне не нужны жесткие коды?

Ответы [ 5 ]

6 голосов
/ 29 сентября 2011

Просто запишите путь к приложению как глобальную переменную js из вашего основного представления, а затем создайте ссылки как

APPPATH + "path/whatever"
3 голосов
/ 08 апреля 2014

Просто нужно было решить эту проблему для одного из моих плагинов jQuery, где желательно не изменять ничего глобального (т.е. выходить за рамки использования плагина), поэтому мне пришлось игнорировать помеченный ответ.

Я также обнаружил, что, поскольку я размещаю DEV локально в IIS, я не могу использовать относительный путь к корню (так как localhost не является корнем).

Решение, которое я нашел, расширенноес чего я уже начал: атрибут data-controller, указывающий, какой контроллер использовать в элементе, к которому я применяю свой плагин.Я считаю, что предпочтительнее использовать данные для имен контроллеров, чтобы их можно было легко использовать повторно.

Предыдущий:

   <div data-controller="Section">

Решение:

   <div data-controller="@Url.Content("~/Section")">

Это вводиткорень сервера (например, /Test.WindowsAzure.Apr2014/ перед именем контроллера, поэтому я получаю /Test.WindowsAzure.Apr2014/Section, который идеально подходит для добавления actions и других параметров, которые у вас есть. Это также позволяет избежать абсолютного пути в выводе (который занимаетлишние байты без веской причины).

В вашем случае используйте что-то вроде:

// Assuming $element points to the element your plugin/code is attached to...
var baseUrl = $element.data('controller');
var url = baseUrl + '/service?param1=' + param;

Обновление:

Другой подход, который мы сейчас используем, когда мы не против инъекцийглобальным значением является Razor-инжектирование одной глобальной переменной JavaScript в window в файле макета с помощью:

<script>
   window.SiteRoot = "@Url.Content("~/")";
</script>

и использование его с

var url = window.SiteRoot + '/service?param1=' + param;
2 голосов
/ 29 сентября 2011

Мне действительно нужен путь, чтобы заставить это работать, возможно, это IE7. Кто знает. Но это сработало для меня.

Захватите URL и сохраните его где-нибудь. Я решил реализовать атрибут данных из HTML5.

<div id="websitePath" data-websitePath='@Request.Url.GetLeftPart(System.UriPartial.Authority)@Request.ApplicationPath'></div>

Тогда, когда вам нужно выполнить AJAX или иным образом использовать URL в javascript, вы просто ссылаетесь на сохраненное значение. Кроме того, существуют различия в версиях IIS (не круто, если ваш devbox - IIS5, а ваш сервер - IIS7). @Request.ApplicationPath может возвращаться или не возвращаться с добавлением '/' в конце. Итак, в качестве обходного пути я также обрежу последний символ, если он /. Затем включите / как часть URL.

var urlprefix = $('#websitePath').data('websitepath');
urlprefix = urlprefix.replace(/\/$/, "");
var url = urlprefix + '/service/service?param1=' + param;
2 голосов
/ 29 сентября 2011

Один вариант:

var editLink = '@Url.Action("_EditActivity", "Home")';
$('#activities').load(editLink + "?activityID=" + id);

другой пример:

var actionURL = '@Url.Action("_DeleteActivity", "Home")';
$('#activities').load(actionURL + "?goalID=" + gID + "&activityID=" + aID);

Если вам не нужно добавлять в строку:

$('#activities').load('@Url.Action("_Activities", "Home", new { goalID = Model.goalID},null)');
0 голосов
/ 02 марта 2014

Хотя принятый ответ верен, я хотел бы добавить предложение (т.е. как я это делаю).

Я использую MVC, и любой ajax-запрос отправляется на контроллер. У моих контроллеров есть сервисы, поэтому, если требуется сервисный вызов, контроллер примет это.

Так в чем же я? Так что если ajax всегда связывается с контроллером, то я бы хотел, чтобы маршрутизация MVC решила путь для меня. Итак, то, что я пишу в Javascript для URL, выглядит примерно так:

url: 'controller/action'

Таким образом, нет необходимости в корневом пути и т.д. ...

Кроме того, вы можете поместить это в отдельный файл Javascript, и он также будет работать, тогда как @ Url.Content необходимо будет вызывать для представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...