onsdag 2 april 2008

Fix för whitespace-bugg i ASP.NETs UpdatePanel

Idag satt jag i kanske tre timmar med en ruskigt irriterande IE-visningsbugg som jag trodde skulle driva mig till vansinne. MEN jag hittade till slut en fix, eller workaround i alla fall.

Felscenario: Om man har en UpdatePanel utan innehåll (eller med osynligt innehåll) så kommer den, när den uppdateras, att renderas som en div-tagg, förutsatt att dess RenderMode är satt till Block, vilket är default. Taggen kommer, vare sig man vill eller ej, att innehålla en massa whitespace - som i sin tur triggar en visningsbugg i Internet Explorer 6. En vettig webbläsare förstår att en div som bara innehåller whitespace inte har något innehåll och därför inte ska ta upp plats på sidan. Så är inte fallet för IE6 - där kommer nämligen div:en att få samma höjd som den aktuella fontstorleken.

Sjukt frustrerande! Om det hade varit en vanlig statisk div så hade man kunnat komma runt det hela genom att manuellt ta bort allt whitespace mellan taggarna, men det kan man inte på något enkelt sätt med en standardkontroll, om man inte vill skriva om hela renderingen för kontrollen. Det vill inte jag, i alla fall.

Fix: Efter mycket lidande kom jag på en lösning. Lägg helt enkelt till ett absolutpositionerat element inuti UpdatePanel:en, till exempel s¥här:

<asp:UpdatePanel ID="upTest" runat="server">
  <ContentTemplate>
    <div style="position: absolute; width: 0; height: 0;"></div>
  </ContentTemplate>
</asp:UpdatePanel>

Problemet löst! Visst, jag tycker inte om att lägga in markup som inte gör något, men om det krävs för att lösa en bugg som annars får sidan att se helt muppig ut s¥ implementerar jag den utan att blinka.

1 kommentar:

  1. Hmm.. inte tänkt på det problemet. Vet själv en gång att jag var tvungen att sätta display: inline på den autogenererade diven som skapas av .net.

    Skönt att du löste det iaf. Men kom-ihåg. Oftare enklare och bättre att tänka om och lösa problemet utan massa fixar...kanske inte exakt som man tänkte de från början. Ibland blir det bättre. Ibland lite sämre =)

    SvaraRadera