2009-05-28 3 views
16

Я загружаю некоторый контент через jQuery.load ('/ Business/Tags'), который хорошо работает при использовании моего локального веб-сервера. Но при использовании iis это не решает правильно. Я видел пару различных способов обойти это, например ResolveUrl. Каков наилучший способ обработки разрешающих URL-адресов в вашем javascript?ASP.NET MVC разрешает URL-адреса в javascript

ответ

18

Я столкнулся с этой проблемой с моим JavaScript. Поскольку мой JavaScript был также в отдельном файле, который был включен в мою главную страницу, я не мог использовать ResolveUrl в моем случае.

Вот как я решил это в моем случае. Я включил следующий JavaScript в моей голове тега в моей главной странице: в верхней части

<script type="text/javascript"> 
    var baseUrl = "<%= Request.Url.GetLeftPart(UriPartial.Authority) %>"; 
</script> 

Я устанавливаю глобальную переменную, доступной для всех моих файлов JavaScript называемых BaseUrl.

Ваш код будет затем стать:

jQuery.load(baseUrl + '/Business/Tags'); 
+0

Я пробовал этот метод, но я не понимаю, что мне нужно, но я думаю, что смогу с ним работать.Я получаю строку вроде этого «http: // mtsengv003 /», но мне нужен такой «http: // mtsengv003/MVC /». Спасибо – 2009-05-28 21:13:35

+5

Я думаю, что лучше использовать: var baseUrl = "<% = Запрос .Url.GetLeftPart (UriPartial.Authority) + Request.ApplicationPath.TrimEnd ('/')%> "; –

+0

@ eu-ge-ne: Спасибо, что указали это. Моя память не так, как раньше. Ваш код идеален. –

5

Что касается меня, я использую Url.Action/Url.RouteUrl хелперы с JavaScript/JQuery, где можно:

$.load('<%= Url.Action("Tags", "Business") %>') 

или

$.load('<%= Url.RouteUrl("BusinessTagsRoute") %>') 

В других случаях я использую ResolveUrl помощника (из MVCContrib или ваш может написать свой собственный):

$.load('<%= Url.ResolveUrl("~/Business/Tags") %>') 

ОБНОВЛЕНО:

Также можно создать специальный контроллер для JavaScript/JQuery с действиями, возвращая PartialViews с JavaScript:

public ActionResult YourJavaScript() 
{ 
    Response.ContentType = "application/x-javascript"; 
    return PartialView("YourJavaScript"); 
} 

Затем в YourJavaScript.ascx вас может использовать код JavaScript/jQuery с тегами сервера WebForms. Я по-прежнему рекомендую не использовать мало закодированные URL-адреса в jQuery/AJAX

+1

Если вы разместите весь свой JavaScript в отдельном файле, а затем ссылаетесь на этот файл, используя Url.Content на главной странице, Url.ResolveUrl не будет работать в вашем JavaScript. Кто-то, пожалуйста, поправьте меня, если я ошибаюсь. –

1

Я по-прежнему рекомендую использовать базовый тег href на главной странице. поэтому любые образы или вызовы javascript будут устранены из этого URL-адреса. Это позволит вам поместить ваши javascript-функции/вызовы во внешний файл js.

 
<html> 
    <head> 
     <base href="http://www.mysite.com/virtual_dir1/"> 
     <script src="location_of_js_file"> 

Запомните окончание '/' в базе href.

Кроме того, удалите ведущие «/», и всякий раз, когда вы делаете jQuery.load («Бизнес/Метки»), это действительно будет от http://www.mysite.com/virtual_dir1/Business/Tags.

+0

Мне действительно очень нравится этот подход. Такой чистый и требует такого небольшого усилия. Спасибо – lomaxx

+0

Это определенно прагматичный подход к проблеме, но используя ['base'] (http://www.w3.org/TR/REC-html40/struct/links.html#h-12.4) таким образом, неверен. Базовый HREF должен использоваться только для разрешения относительных URI на текущую страницу, на которой вы находитесь. Установив 'base' таким образом ** все ** относительные URI на этой странице будут указывать на' http: // www.mysite.com/virtual_dir1/'. – ahsteele

2

Несколько способов, которые мы делаем это в наших приложениях:

var applicationPath = '<%= Url.Content("~/") %>'; 

ИЛИ

var applicationPath = '<%= Request.Url.Scheme %>://<%= Request.Url.Host %><%= Request.ApplicationPath %>/'; 

Затем мы используем ApplicationPath как базовый URL для всех наших Ajax звонки.

Смежные вопросы