ASP.NET - путь к ссылкам .CSS и .JS - PullRequest
13 голосов
/ 09 апреля 2009

У меня есть мастер-страница в корне моего проекта. У меня есть контент-страницы в моем проекте и во вложенных папках, ссылающихся на эту мастер-страницу. Как правильно ссылаться на мои файлы .CSS и .JS, если я всегда хочу, чтобы они были относительно корня?

Вот как я это делаю сейчас:

link href="/common/css/global.css"
script src="/common/javascript/global.js"

Но это разрывает связь. Я попытался без начального "/", но это не сработало на моих страницах во вложенных папках.

Ответы [ 4 ]

19 голосов
/ 09 апреля 2009

Я бы использовал что-то вроде

Server.ResolveClientUrl("~/common/css/global.css")

Это всегда будет правильный URL для вас.

Пример:

За комментарий это будет полное использование.

<link type="text/css" rel="stylesheet" 
    href='<%= Server.ResolveClientUrl("~/common/css/global.css") %>' />

Согласно комментариям, другое подтвержденное использование, нет «ошибка CS1061:« System.Web.HttpServerUtility »не содержит определение» ошибка:

    <script type="text/javascript" 
src="<%= Page.ResolveUrl("~/Scripts/YourScript.js") %>" ></script>

Также важно всегда ставить закрывающий тег.

4 голосов
/ 10 апреля 2009

Вы можете сделать тег <link> для запуска на сервере, чтобы Asp.Net разрешал вам URL следующим образом:

<link href="~/common/css/global.css" runat="server" />

(обратите внимание на '~')
Я не знаю, можно ли применить его к тегу <script>, попробуйте ...

РЕДАКТИРОВАТЬ: Я недавно обнаружил в проекте, что вы можете (и должны) использовать ScriptManager для хранения ваших скриптов (вы можете иметь только 1 на страницу). Вы можете поместить один в вашу MasterPage и ссылаться на все ваши сценарии. Внутри вашей страницы контента вы затем добавляете ScriptManagerProxy, который будет «ссылаться» на скрипты на главной странице, и вы даже можете добавлять другие скрипты только для этой страницы контента.

2 голосов
/ 18 марта 2013

Решения, которые я видел до сих пор, не работали в моем проекте (особенно не для ссылок .css). Проблемы были следующие:

  • внутри <link> не удалось разрешить выражение <%=...%>
  • он не нашел Page.ResolveURL во всех случаях
  • возникли проблемы с кавычками 'и', если вы вставили <%=...%>

Итак, я хотел бы предложить это решение: В коде (класс C # вашей главной страницы) добавьте следующие 3 метода:

public partial class SiteBasic : System.Web.UI.MasterPage
{
    public string ResolveURL(string url)
    { 
        var resolvedURL=this.Page.ResolveClientUrl(url);
        return resolvedURL;
    }

    public string cssLink(string cssURL)
    {
        return string.Format("<link href='{0}' rel='stylesheet' type='text/css'/>", 
                    ResolveURL(cssURL));
    }

    public string jsLink(string jsURL)
    {
        return string.Format("<script src='{0}' type='text/javascript'></script>", 
                    ResolveURL(jsURL));
    }
}

Для таблицы стилей ссылок вы можете сказать:

<%=cssLink("~/css/custom-theme/jquery-ui-1.8.20.custom.css")%>

Для JavaScript ссылок это выглядит так:

<%=jsLink("~/Scripts/jquery-1.7.2.js")%>

А для других ссылок вы можете использовать:

<a href='<%=ResolveURL("~/Default.htm")%>'>link</a>
<img title='image' src='<%=ResolveURL("~/Images/logo.png")%>'/>

Примечание: Я обнаружил, что лучше использовать одинарные кавычки снаружи и двойные кавычки внутри атрибута href или src, как показано в примере выше. В некоторых случаях, как я обнаружил, выполнение этого действия вызывало проблемы.

Это простое решение, и оно хорошо работает в моем случае, даже если страницы, ссылающиеся на главную страницу, находятся в разных подкаталогах. По сути, он переводит путь ~ (который должен быть абсолютным от корня вашего веб-сайта) в относительный путь (используя столько ../ в пути, сколько необходимо) на основе страницы, на которой вы находитесь в данный момент. отображение.


Расширенный совет:

Если вы используете AJAX-вызовы для вызова методов веб-службы , то у вас возникнет та же проблема со ссылками на них, если у вас есть страницы ASPX на разных уровнях каталогов. Я рекомендую вам определить что-то вроде (при условии, что ваши веб-сервисы находятся в каталоге ~/AJAX):

<script type="text/javascript">
    function getWebServicePath() { return '<%=ResolveURL("~/AJAX/")%>'; } 
</script>

в разделе <head> ... </head> главной страницы . Это сделает путь входа веб-сервиса доступным в вашем JavaScript. Вы можете использовать его как

$.ajax({
    type: "POST",
    url: getWebServicePath()+"myWebService.asmx/myMethod",
    data: $.toJSON({ param: "" }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
            // ... code on success ...
    },
    error: function (ex) {
            // ... code on error ...
    }
});
2 голосов
/ 18 октября 2011

Я делаю это так просто: link href="<%=ResolveUrl("~/common/css/global.css")%>"

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