Stacks og Once
Det kan nogle gange være brugbart i et view, at kunne indsætte noget kode i et parent view, fx. fra en template til et master view. Til dette findes konceptet med sections, hvor der i master viewet er defineret en section som @RenderSection("InsideFooter", false), og når man så skal indsætte noget i sektionen i sin template, skrives der:
@section InsideFooter{ <!-- I'm inside the footer -->}Det fungere fint og godt, men det virker ikke i partial views.
For at kunne komme om det, har vi opfundet (eller rettere sagt stjålet fra Laravel) et koncept der hedder Stacks.
Et stack er et array af tekst, som gemmes i hukommelsen mens en side renderes.
Helt præcist går det ud på at man i et partial view kan “pushe” noget kode til et stack, ved at bruge TagHelperen <ec-push-stack>.
Den bruges således:
<ec-push-stack id="footer" key="comment-about-footer"> <!-- I'm inside the footer --></ec-push-stack>På serveren gemmes så taghelperens child content i hukommelsen i et array med navn efter id’et på stacken. I dette eksempel footer.
key attributten bruges til at give den aktuelle kodestump en unik nøgle, for at sikre at den ikke lander i stacken mere end én gang. Fx. hvis du skal loade et eksternt script, eller sætte noget javascript op. Attributten er valgfri, og er den ikke udfyldt, er der ikke nogen begrænsning på hvor mange gange en kodestump kan tilføjes en stack.
Child contentet og selve tag-helperen fjernes så fra outputtet, så den ikke ses i markuppen.
For at outputte indholdet af et stack, skal du så indsætte en anden TagHelper, <ec-stack>.
Fx. i dit Master-view, kan du indsætte
<ec-stack id="footer"></ec-stack>Og serveren vil så indsætte alt indholdet der er blevet pushet til den stack der hedder footer.
Gotcha
Sektion kaldt “Gotcha”Fordi defaulten i .net5+ er at views bliver sendt i små bidder ned til brugeren (det går hurtigere), kan vi ikke fra bunden af et view ændre noget der sker i toppen som vi kunne i .net4. Du kan derfor ikke indsætte din <ec-stack> i dit view, før de dele der pusher til den, kommer i spil uden at mangle noget.
Vær derfor opmærksom på at stacks enten kommer meget sent i viewet, eller i det mindste efter der pushes til dem.
En workaround til dette, er at slå Response Buffering til ved at installere Microsoft.AspNetCore.Buffering og tilføje app.UseResponseBuffering(); til Startup.Configure metoden, for at slå response buffering til. Det kommer med et performance hit, så det skal helst undgås, da vi jo gerne vil lave hurtige løsninger.
Render Once
Sektion kaldt “Render Once”Har du en one-off udfordring med noget kode, der kun må komme ud i slutresultatet én gang, selvom det står i et loop. Fx. noget javascript til at aktivere noget i et loop, behøver du ikke nødvendigvis bruge stacks. Der findes også en TagHelper kaldet <ec-once>, der kan gøre nogenlunde det samme.
Den bruges således:
<ec-once key="some-unique-id"> <!-- I only render once --></ec-once>key attributten udfyldes med et unikt id for kodestumpen, det kan fx. også være et frisk genereret Guid, med Guid.NewGuid().ToString(), vigtigt er blot at det er unikt, for når først id’et er brugt, vil øvrige referencer blive ignoreret.