[asp.net] Inline tags komen letterlijk in de source

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Ik moet wat templates aanpassen in een project met ASP.NET 2.0. Ik heb de volgende code (wat relevant is):
HTML:
1
2
3
4
<head id="Head1" runat="server">
  <link rel="stylesheet" href="//<%= SiteManager.RetrievePortalURL() %>/includes/css/style.css" media="screen" />
  <script src="//<%= SiteManager.RetrievePortalURL() %>/includes/js/jquery-1.6.2.min.js"></script>
</head>

Die <head> moet als runat=server draaien. Dat is gewoon nodig voor de werking van het project, en dat kan en mag ik dus niet veranderen. De script-tag wordt correct uitgepoept. Daat staat op de plek van die inline-tag keurig whatever die RetrievePortalURL methode returnt. Maar bij de link-tag werkt dat niet. Daat wordt letterlijk dit in de html gezet:
HTML:
1
<link rel="stylesheet" href="//&lt;%= SiteManager.RetrievePortalURL() %>/includes/css/style.css" media="screen" />

Ik heb de volgende notaties ook al geprobeerd, en geven allemaal hetzelfde ongewenste resultaat:
code:
1
2
3
4
<%# ... %>
<%$ ... %>
<%: ... %>
<% Response.Write(...) %>

Het lijkt alléén bij de link-tag mis te gaan, terwijl inline-tag in andere tags gewoon geparst worden.
What gives? :?

日本!🎌


Acties:
  • 0 Henk 'm!

  • noNamer
  • Registratie: Juli 2000
  • Niet online
Ik neem aan dat je iets probeert uit te commentariëren? Probeer dan eens <%-- --%>
Zie ook http://weblogs.asp.net/sc...ts-with-ASP.NET-2.0-.aspx

Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Nee, ik wil het resultaat van die methode in de tag krijgen.

/edit
Ik heb nu wel ontdekt, na wat nader onderzoek naar die inline tags, dat de volgende notaties...
HTML:
1
2
3
<link rel="stylesheet" href="<%# "//" + SiteManager.RetrievePortalURL() + "/includes/css/style.css" %>" />
<link rel="stylesheet" href="<%= "//" + SiteManager.RetrievePortalURL() + "/includes/css/style.css" %>" />
<link rel="stylesheet" href="//<%= SiteManager.RetrievePortalURL() %>/includes/css/style.css" />

...respectievelijk de volgende resultaten opleveren...
HTML:
1
2
3
<link rel="stylesheet" href="" />
<link rel="stylesheet" href="//www.example.com/includes/css/style.css" />
<link rel="stylesheet" href="//&lt;%= SiteManager.RetrievePortalURL() %>/includes/css/style.css" />

Die tweede doet dus wat ik wil, maar met nogal lelijke template-code. Maar wat is in godsnaam het verschil tussen de tweede en de derde? Het maakt toch geen zak uit waar je inline-tags neerzet? En waarom werkt de derde notatie dan wel in een script-tag??

[ Voor 89% gewijzigd door _Thanatos_ op 12-08-2011 12:33 ]

日本!🎌


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

_Thanatos_ schreef op vrijdag 12 augustus 2011 @ 12:26:
Nee, ik wil het resultaat van die methode in de tag krijgen.

/edit
Ik heb nu wel ontdekt, na wat nader onderzoek naar die inline tags, dat de volgende notaties...
HTML:
1
2
3
<link rel="stylesheet" href="<%# "//" + SiteManager.RetrievePortalURL() + "/includes/css/style.css" %>" />
<link rel="stylesheet" href="<%= "//" + SiteManager.RetrievePortalURL() + "/includes/css/style.css" %>" />
<link rel="stylesheet" href="//<%= SiteManager.RetrievePortalURL() %>/includes/css/style.css" />

...respectievelijk de volgende resultaten opleveren...
HTML:
1
2
3
<link rel="stylesheet" href="" />
<link rel="stylesheet" href="//www.example.com/includes/css/style.css" />
<link rel="stylesheet" href="//&lt;%= SiteManager.RetrievePortalURL() %>/includes/css/style.css" />

Die tweede doet dus wat ik wil, maar met nogal lelijke template-code. Maar wat is in godsnaam het verschil tussen de tweede en de derde? Het maakt toch geen zak uit waar je inline-tags neerzet? En waarom werkt de derde notatie dan wel in een script-tag??
het verschil is dat '/' een escape character is in veel talen

'//' zou er dus toe kunnen leiden dat de '<' geescaped wordt en dus vertaald naar '&lt ;' en niet zorgt voor het parsen van je statement

[ Voor 5% gewijzigd door YakuzA op 12-08-2011 12:56 ]

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Maar waarom dan alleen in de <link> tags?

日本!🎌


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

bedacht me net dat '\' natuurlijk de escape is, en niet '/'
Raar verhaal dus dat het naar '&lt ;' wordt geparsed

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • keesdewit
  • Registratie: December 2003
  • Laatst online: 19-06 20:46
Dit werkt denk ik wel:

C#:
1
<link runat="server" rel="stylesheet" href='<%= string.Concat(SiteManager.RetrievePortalURL(), "/includes/css/style.css") %>' media="screen" /> 


Zie de enkele quotes bij het href attribuut.

[ Voor 10% gewijzigd door keesdewit op 13-08-2011 11:23 ]


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

En anders werkt het runat=server attribuut bij de head weghalen ook :)

[ Voor 3% gewijzigd door gorgi_19 op 22-08-2011 19:18 . Reden: stomme autocomplete van de ipad ook :( ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Nee, de "oplossing" was om de hele attribuut in <%..%> te zetten (exclusief de quotes). Heel, heel erg vies van .NET dat ie niet eens die tags kan parsen waar *ik* wil dat ze komen. Handig hoor, die intelligentie. Heel erg handig.

runat="server" toevoegen is al helemaal een no-go. Waarom zou ik m'n html gaan vergallen omdat asp.net het anders niet snapt??

日本!🎌


Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 18-09 13:37

sopsop

[v] [;,,;] [v]

Heb je het ook met de single quotes geprobeerd?

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

_Thanatos_ schreef op maandag 22 augustus 2011 @ 02:39:
runat="server" toevoegen is al helemaal een no-go. Waarom zou ik m'n html gaan vergallen omdat asp.net het anders niet snapt??
Ik had het ook over weghalen, niet toevoegen :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
_Thanatos_ schreef op maandag 22 augustus 2011 @ 02:39:
Nee, de "oplossing" was om de hele attribuut in <%..%> te zetten (exclusief de quotes). Heel, heel erg vies van .NET dat ie niet eens die tags kan parsen waar *ik* wil dat ze komen. Handig hoor, die intelligentie. Heel erg handig.
HTML link tags binnen een head tag met runat="server" worden behandeld als volledige ASP.NET server controls, waarbinnen de inline assignment tag constructie <%= %> niet toegestaan is. WebForms past daarom netjes automatisch zijn URL encoding toe op het href attribuut van de tag, net zoals dat bij alle server controls gebeurt. Daardoor krijg je een URL-encoded versie van de literal string terug.

Een stop-gap oplossing is om expression builders te gebruiken die ASP.NET expliciet vertellen dat de constructie in kwestie inline code is en niet een literal string.

De echte oplossing is om netjes over te schakelen naar het gebruik van één view model per Page of Control en dat te databinden. Alle waardes die je via markup toekent laat je dan met inline databinding tags <%# %> werken die dit view model raadplegen.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je zou ook je link in je codebehind kunnen toevoegen, aangezien je toch al code nodig hebt om de juiste css file op te halen lijkt me dat wellicht nog het netste.

C#:
1
2
3
4
5
6
HtmlLink link = new HtmlLink();
link.Attributes.Add("href", url);
link.Attributes.Add("rel", "stylesheet");
link.Attributes.Add("type", "text/css");

this.page.Header.Controls.Add(link);


Wellicht even wrappen in een nette functie. ;) Je kunt het verder uitbreiden naar een stylesheet manager class die met behulp van unieke identifiers ook nog zorgt dat dezelfde css niet twee keer wordt ingeladen als verschillende usercontrols in de pagina dezelfde css files willen includen.

Op die manier kun je de verantwoordelijkheid van het inladen van een css file bij de usercontrol leggen, ipv bij de pagina.

[ Voor 69% gewijzigd door Grijze Vos op 23-08-2011 10:19 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
R4gnax & Grijze Vos
Dank voor de uitleg en suggesties, maar ik ben een front-end developer. Ik ga dat soort dingen dus niet om zitten bouwen. Ik wil in de front-end kunnen werken, en daarmee dus gewoon een <link> tag kunnen schrijven. Dat is ook gewoon logischer, omdat je dan in één oogoplsag ziet wat er staat er wat er zeer waarschijnlijk gaat komen in de html.

日本!🎌

Pagina: 1