ASP.NET MVC и относительные пути в Javascript - PullRequest
2 голосов
/ 17 декабря 2009

Этот вопрос основан на аналогичном вопросе «Относительные пути ASP.NET MVC», расположенном здесь .

Я понимаю, что возникают проблемы, касающиеся абсолютных и относительных путей при разработке приложения ASP.NET ... особенно приложения ASP.NET MVC. На протяжении всего жизненного цикла приложения для разрешения путей на страницах ASPX я использовал что-то похожее на следующее:

<script type="text/javascript" src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>"></script>

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

Мой вопрос, однако, что я могу сделать с относительными путями, расположенными в файлах Javascript? Как они могут быть решены? До этого момента я встраивал Javascript для каждой страницы в саму страницу, поэтому я могу разрешить URL, используя подход, аналогичный описанному выше. В результате Javascript выглядит примерно так:

$(function() {
    $.getJSON('<%= Url.Content("~/home/test/1") %>', null, function(data) {
        // Do stuff in here
    });
});

Это работает нормально, конечно, пока я не переместлю все со страницы ASP.NET в центрально расположенный файл Javascript. В соответствии с вышеупомянутым вопросом :

Или вы можете использовать document.location.host построить полное имя пути внутри JavaScript: document.location.host + «/Content/Images/MyImage.jpg"

Другой способ - использовать ASP.NET. построить эту часть сценария динамически, чтобы полностью вводится полное имя пути. можно сделать это с помощью ScriptManager.RegisterStartupScript или ScriptManager.RegisterScriptBlock

Приложение - довольно тяжелый пользователь Javascript, поэтому я не уверен, сработает ли второй вариант. Есть ли более элегантный способ решения этой проблемы, кроме первого варианта? Что вы, ребята, сделали, чтобы решить эту проблему? Любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 2 ]

3 голосов
/ 17 декабря 2009

Один из способов может заключаться в том, чтобы ваш JS-скрипт брал ссылку на объект, и этот объект был бы создан в представлении / частичном, содержащем необходимый вам относительный путь. Тогда ваш код файла JS может использовать этот объект для создания путей по вашему усмотрению.

Вид боли, но это сработало бы, как в:

var paths = 
{
    imagePath: '<%= Url.Content("~/Content/Images/MyImage.jpg") %>'
}

var obj = myJSFileObject.Load(paths);
//continue

НТН

0 голосов
/ 17 декабря 2009

Хотя я не использую MVC (пока), в моем классе Page есть коллекция путей к скриптам, которые автоматически добавляются в верхнюю или нижнюю часть HTML-страницы по мере ее отображения (в зависимости от ситуации).

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

В любом случае регистрация выглядит примерно так:

 MyPage.AddScriptBlock(Path:="{apppath}scripts/myscript.js", LoadAtTop:=True)

Класс Page выполняет быстрый поиск / замену при создании тегов SCRIPT для них при рендеринге:

 Writer.Write(New JavascriptBlock( _
    thisscript.Path.Replace("{apppath}", AppPath()))

Функция AppPath () выглядит следующим образом:

 Private Shared pvtAppPath As String
 Public Shared Function AppPath() As String
If pvtAppPath="" Then
   With System.Web.HttpContext.Current.Request
    pvtAppPath = "http://" & .Url.Host & .ApplicationPath
   End With
   If Not pvtAppPath.EndsWith("/") Then pvtAppPath &= "/"
End If
Return pvtAppPath
 End Function

Это дает мне всю необходимую функциональность:

  1. У меня могут быть файлы JavaScript, загруженные по умолчанию на каждой странице.
  2. Некоторые файлы JavaScript могут загружаться только на отдельной странице.
  3. Я могу переопределить (1) при необходимости, удалив его из коллекции.
  4. Я могу контролировать (для производительности), находится ли скрипт в ГОЛОВНОЙ или нижней части ТЕЛА
  5. Я могу использовать один и тот же код на своих устройствах разработки и производства.
  6. Мои теги сценария гарантированно генерируются согласованным образом.

Я не знаю точно, как это вписывается в MVC, но, надеюсь, это даст вам некоторые идеи.

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