søndag den 15. juli 2012

Overvejelser i Partial Views?


Efter jeg i går havde lavet min systemudvikler del om stødte jeg nu på et problem.
Hver anden række skal right-alignes for at give en bedre præsentation, og den første forhindring jeg stødte på var at jeg nu ikke havde nogen alternating-row-template som man bruger i webforms.
Det er jo meget nemt i en repeater, men alligevel meget ueffektivt fordi du skal have stort set samme kode stående to steder, i stedet for at definere forskellene.

Første gang tænkte jeg at jeg måtte lave det samme som man gør i webforms. Et tjek for om det var den første eller anden række og så derefter lave et præcis samme kode, med modifikationer de steder der skulle.
Alligevel er jeg tilpas perfektionist til at jeg bare måtte se om jeg ikke kunne lave det smartere, og ganske rigtigt det kunne jeg.
Det jeg lavede var at lave en if-sætning der tjekkede modulus 2 (i % 2 == 0), som kunne sige at hvis det var den første skulle billedet indsættes.
Efter dette område indsættes texten og det område med tekst.
Efter dette lavede jeg det modsatte tjek for at se om det var alternate row, og samme kode. Derved ville billedet blive indsat i før teksten i første række, og i den næste række ville billedet komme efter teksten og se modsat ud på grund af den er right alignet.

"Desværre" er man jo perfektionistisk så dette var heller ikke løsningen for mig, fordi igen hvis noget skulle rettes skulle det rettes to steder og det er slet ikke effektiv og smuk kode og går mig på.
Så jeg begyndte at se på Partial View.

Samme princip kan man også udnytte i webforms, men har aldrig rigtigt haft behov for at bruge det.
Det smarte her er jo at du kan videresende data med din model, eller via ViewBag. Førstnævnte er jo selvfølgelig den man foretrækker og synes er mest lækker så også denne jeg vil promovere i eksempelet.

I mit View er min model med en liste af profiler, som jeg præsenterer.
Det jeg så vil er at sende denne ene profil til mit Partial View således at mit billede bliver renderet et enkelt sted, og kan kalde denne før og efter teksten, alt efter om det er den første række eller anden og så frem deles.
Så i mit view er min model en model der har en liste af profiler, og i partial view er min model kun mit profil-objekt da det er denne der har de oplysninger jeg skulle bruge.

Den udfordring jeg så stødte på var at der er forskel på
@Html.Partial
og
@Html.RenderPartial

Af en eller anden grund så virkede Html.RenderPartial ikke, men så snart jeg skiftede til Html.Partial så virkede det.
Så det der sørger for mit partial view bliver renderet er:
@Html.Partial("_ProfileImageSection", Model.ProfileList.ElementAt(i).Value);

Jeg har undersøgt lidt på forskellene og fundet følgende:
Html.Partial returns a string, Html.RenderPartial calls Write internally, and returns void.
You can store the output of Html.Partial in a variable, or return it from a function. You cannot do this with Html.RenderPartial. The result will be written to the Response stream during the execution.

Jeg skal er ikke sikker på om det er grunden, men fordi dette sker inde i et for-loop kan det være at det bliver lavet for tidligt og udenfor context fordi responset ikke er klar på eksekveringstidspunktet.
Men for mig virkede det i hvertfald at skifte og kan være nogle derude kan bruge det.

Ingen kommentarer:

Send en kommentar

Kan du lide mit indlæg, har en kommentar, forslag eller andet på hjerte så skriv venligst