2009-04-09 11 views
13

Mam stronę wzorcową w katalogu głównym mojego projektu. Mam Strony Treści w całym moim projekcie oraz w podfolderach odwołujących się do tej Strony Wzorcowej. Jaki jest prawidłowy sposób odwoływania się do moich plików .CSS i .JS, jeśli zawsze chcę, aby były względne względem katalogu głównego?ASP.NET - ścieżka do użycia w celu odniesienia .CSS i .JS

Oto jak to robię teraz:

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

Ale to przerywa połączenie. Próbowałem bez wiodącego "/", ale to nie działało na moich stronach w podfolderach.

Odpowiedz

19

chciałbym użyć czegoś podobnego

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

będzie to uzyskać właściwe url dla Ciebie w każdej chwili.

Przykład:

Za komentarz będzie to pełne wykorzystanie.

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

Według uwag, inne zatwierdzone użytkowania, nie "error CS1061: 'System.Web.HttpServerUtility' nie zawierają definicji" Błąd:

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

Również ważne jest, aby zawsze umieścić zamykanie tag.

+0

Więc po prostu zrobiłbym to w bloku kodu w linii w moim pliku .aspx? –

+0

Mike - Poprawiono wpis na przykładzie –

+2

Dodatkowo używałbym ResolveUrl vs ResolveClientUrl, URL klienta wyjaśni ścieżkę w stosunku do miejsca, w którym TWÓJ jest teraz, tj. - użyje ../../ jeśli jesteś powyżej, wersja ResolveUrl zawsze będzie działać absolutnie. To może nie wydawać się ważne, ale jest błąd dotyczący * cont * – meandmycode

4

Można zrobić tag <link> uruchomić na serwerze, tak Asp.Net rozwiąże URL dla ciebie tak:

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

(Zauważ, że „~”)
ja nie wiem, czy to można go zastosować do tagu <script>, ale powinieneś spróbować ...

EDYCJA: Ostatnio odkryłem w projekcie, że możesz (i powinieneś) użyć skryptu (ScriptManager) (możesz mieć tylko 1 na stronę) . Możesz umieścić go na swojej stronie głównej i odnosić się do wszystkich swoich skryptów. Wewnątrz strony z treścią dodajemy ScriptManagerProxy, która "odwołuje się" do skryptów na stronie wzorcowej, a można nawet dodawać inne skrypty tylko dla tej strony treści.

+5

Tylda nie będzie działać dla pliku javascript. –

2

zrobić to tak proste, jak to: link href="<%=ResolveUrl("~/common/css/global.css")%>"

2

Rozwiązania widziałem do tej pory nie działał w moim projekcie (zwłaszcza nie dla .css linków). Problemy były następujące:

  • wewnątrz <link> to nie rozwiązało wyraz
  • nie znaleźć stronę <%=...%>.ResolveURL we wszystkich przypadkach
  • było pewne problemy z "i" cytuje jeśli embedd <%=...%>

Więc chciałbym zaoferować tego rozwiązania: w kodzie tyłu (C# klasy Twojej strony wzorcowej za), dodać The 3 następujących metod:

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)); 
    } 
} 

Dla stylsheet odniesienia, można wtedy powiedzieć:

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

Dla JavaScript odniesień, to wygląda tak:

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

I innych odniesienia, można użyć:

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

Uwaga: znalazłem lepiej jest używać apostrofów zewnętrzne i podwójne cudzysłowy wewnątrz atrybutu href lub src, jak pokazano w powyższym przykładzie. Wykonanie go na odwrót spowodowało w niektórych przypadkach kłopoty, które znalazłem.

To rozwiązanie jest proste i działa dobrze w moim przypadku, nawet jeśli strony odwołujące się do strony wzorcowej znajdują się w różnych podkatalogach. To, co w zasadzie robi to tłumaczenie ścieżki (która musi być absolutna od katalogu głównego twojej witryny) do ścieżki względnej (użycie jak największej liczby ścieżek ../) w zależności od strony, którą aktualnie wyświetlasz.


zaawansowane podpowiedź:

Jeśli używasz AJAX wywołuje w celu wywołania metod usług internetowych, to będziesz miał ten sam problem ich odsyłania jeśli masz strony aspx na różnych poziomach katalogów . Polecam zdefiniować coś jak (przy założeniu, że usługi internetowe znajdują się w katalogu ~/AJAX):

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

wewnątrz sekcji <head> ... </head> swojej głównej stronie. Spowoduje to, że ścieżka dostępu do usługi internetowej będzie dostępna w twoim kodzie JavaScript. Można go użyć tak, jak

$.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 ... 
    } 
}); 
+1

To powinna być ostateczna odpowiedź. Tutaj jest mnóstwo przydatnych szczegółów. Od pewnego czasu borykałem się z tymi problemami i, w odróżnieniu od zaznaczonej odpowiedzi, nie mogłem wydawać się, że wspomniane referencje działają poprawnie. To wyczyściło to naprawdę fajnie i nauczyło mnie nowej i pomocnej umiejętności. Dziękuję Ci! –

Powiązane problemy