Avatar billede bumle90 Nybegynder
16. august 2004 - 16:14 Der er 39 kommentarer og
1 løsning

Hjælp til viewstate

Jeg har en side med en lang række asp:checkBoxList controls.
Dvs. det er nogle der dynamisk bliver genereret i et datagrid. Worst case er 3000 checkboxlister.
Problemet er at alle disse lister laver en gigantisk VIEWSTATE streng, som fylder over 2 MB. Dvs. det tager 100 år at loade siden.
Jeg ved man kan skrive EnableViewState=False, men når jeg gør det ser det ikke ud til at have den store effekt. Gør jeg noget galt, eller virker EnableViewState ikke for asp:checkBoxList?
Her er en lille kodestump:

                    <asp:TemplateColumn HeaderText="Forlænginger">
                        <ItemTemplate>
                        <asp:CheckBoxList Runat=server ID="chklstExtensions" RepeatDirection=Horizontal CellPadding=0 CellSpacing=0 TabIndex=0 BorderWidth=2 EnableViewState="False">
                        <asp:ListItem />
                        <asp:ListItem />
                        <asp:ListItem />
                        </asp:CheckBoxList>
                        </ItemTemplate>
                    </asp:TemplateColumn>
Avatar billede bumle90 Nybegynder
16. august 2004 - 16:34 #1
Jeg har også prøvet oppe i toppen at skrive følgende i mit page directive:
EnableViewState="False"
Uden nogen virkning
Avatar billede basementjack Nybegynder
16. august 2004 - 16:44 #2
Har du prøvet EnableViewState="False" på dit datagrid?..
Avatar billede bumle90 Nybegynder
16. august 2004 - 16:47 #3
ja....den har jeg også med, og det ignorerer den også totalt...
Den skriver stadig den gigantisk viewstate ud i html-koden.
Avatar billede snepnet Nybegynder
16. august 2004 - 16:51 #4
Hej bumle :o)
Har du prøvet at trace, og se hvad det reelt er der fylder i dit viewstate ?
(men bortset fra det, så synes jeg da at jeg plejer at få rimelig gode resultater når jeg slår viewstate til og fra.... kan du ikke sende helt dit page directive ?)
Mvh
Avatar billede basementjack Nybegynder
16. august 2004 - 16:51 #5
" <pages enableViewState="false" />

This worked out for me, but there is still a huge view state in some of my
pages where controls are programmatically added.  "

-- taget ud af http://www.dotnet247.com/247reference/msgs/27/135779.aspx
Avatar billede basementjack Nybegynder
16. august 2004 - 16:51 #6
Det var så noget til web.config altså.. :)
Avatar billede bumle90 Nybegynder
16. august 2004 - 16:57 #7
joda....her er hele mit page directive:
<%@ Page language="c#" Codebehind="mainform.aspx.cs" AutoEventWireup="false" Inherits="certregister.mainform" enableViewState="false" %>

Men bortset fra det vil jeg helst ikke have slået viewstate fra på hele siden da der er andre controls som jeg bruger til fx. søgning og sådan. Der vil jeg gerne have det. Der er præcist 2 selectboxes og 4 textfelter vidst.
Det er kun på de irriterende checkboxlist-controls det skal være slået fra.
Hmmm jeg kan bare ikke lige få den til det.

Her er hele datagriddet:

            <asp:DataGrid EnableViewState=False runat="server" id="certificatList" BackColor="#eeeeee" HorizontalAlign="Center"
                Font-Name="Verdana" CellPadding="4" Font-Size="10pt" AutoGenerateColumns="False">
                <HeaderStyle BackColor="Black" ForeColor="White" Font-Bold="True" HorizontalAlign="Center"/>
                <ItemStyle HorizontalAlign="Center" />
                <AlternatingItemStyle BackColor="White" />
                <Columns>
                    <asp:TemplateColumn HeaderText="Forlænginger">
                        <ItemTemplate>
                            <asp:CheckBoxList Runat=server ID="chklstExtensions" RepeatDirection=Horizontal EnableViewState="False">
                                <asp:ListItem />
                                <asp:ListItem />
                                <asp:ListItem />
                            </asp:CheckBoxList>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="PDF-certificat">
                        <ItemTemplate>
                            <a href="java script:openNewWin('showPDF.aspx?certID=<%# DataBinder.Eval(Container.DataItem, "CertId")%>',800,600);"><img src="icon_pdf.gif" border="0"></a>
                        </ItemTemplate>
                    </asp:TemplateColumn>
                    <asp:BoundColumn DataField="CertId" Visible="False" />
                    <asp:BoundColumn DataField="Navn" HeaderText="Navn" />
                    <asp:BoundColumn DataField="FDato" HeaderText="Fødselsdato" DataFormatString="{0:yyyy-MM-dd}" />
                    <asp:BoundColumn DataField="Keyword" HeaderText="Betegnelse" />
                    <asp:BoundColumn DataField="UdløbDato" HeaderText="Udløbsdato" DataFormatString="{0:yyyy-MM-dd}" />
                    <asp:BoundColumn DataField="FirmaNavn" HeaderText="Arbejdsgiver" />
                </Columns>
            </asp:DataGrid>
Avatar billede bumle90 Nybegynder
16. august 2004 - 16:59 #8
btw...hvordan tracer jeg og ser hvad der fylder i viewstatet?
P.S. Det er virkelig stort det viewstate. (2 Mb tegn)
Avatar billede snepnet Nybegynder
16. august 2004 - 17:04 #9
Du tracer ved i din web.config at angive :
<trace  enabled="true" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />

Når pageOutput er false, kan du se dit trace ved at gå til http://localhost/<dit web>/trace.axd

Hvis du sætter den true, kommer det hele bare ud på siden.

Du kan i tracet se hvor meget hver enkelt kontrol på siden optager i dit viewstate.
Avatar billede bumle90 Nybegynder
16. august 2004 - 17:31 #10
hmm nu fatter jeg ik lige meget af hvad der sker :P
Nu blir min submitknap_ServerClick(...)
ikke enganga kaldt når jeg trykker på knappen..hmmm
Avatar billede bumle90 Nybegynder
16. august 2004 - 17:33 #11
og jeg har fjernet alt hvad der har med viewstate at gøre...
Avatar billede bumle90 Nybegynder
16. august 2004 - 17:47 #12
Snepnet...Kunne jeg sende dig en mail med noget kode?
Avatar billede bumle90 Nybegynder
16. august 2004 - 18:13 #13
Hmmm det ser ud til mit datagrid laver en masse i tracen......selvom jeg har sat enableViewState=False på den..som vist ovenover.
Det forstår jeg ikke helt...hvad kan være grunden til det?
HEr er et lille udsnit: Det er vidst 1 række i datatabellen

certificatList:_ctl1725 System.Web.UI.WebControls.DataGridItem 299 0
                    certificatList:_ctl1725:_ctl0 System.Web.UI.WebControls.TableCell 141 0
                        certificatList:_ctl1725:_ctl1 System.Web.UI.DataBoundLiteralControl 130 0
                    certificatList:_ctl1725:_ctl2 System.Web.UI.WebControls.TableCell 0 0
                    certificatList:_ctl1725:_ctl3 System.Web.UI.WebControls.TableCell 24 0
                    certificatList:_ctl1725:_ctl4 System.Web.UI.WebControls.TableCell 19 0
                    certificatList:_ctl1725:_ctl5 System.Web.UI.WebControls.TableCell 15 0
                    certificatList:_ctl1725:_ctl6 System.Web.UI.WebControls.TableCell 19 0
                    certificatList:_ctl1725:_ctl7 System.Web.UI.WebControls.TableCell 20 0
Avatar billede snepnet Nybegynder
16. august 2004 - 18:22 #14
Det andet tal viser hvor meget plads der optages i viewstate, så faktisk er der ikke nogle af de kontroller du har vist der bruger noget viewstate... har du nogle andre linier hvor der ser ud til at der bliver brugt viewstate ?
mvh
Avatar billede bumle90 Nybegynder
16. august 2004 - 18:28 #15
hmmm okay...ja altså der er de få søge-controls oppe i toppen. De bruger lidt, men det er ikke så meget igen. Ihvertfald ikke noget i forhold til hvor stor viewstate-feltet er i html-outputtet. Det er helt gigantisk. Her er tracen for de andre server controls.

__PAGE ASP.mainform_aspx 722453 20
    _ctl3 System.Web.UI.ResourceBasedLiteralControl 1546 0
    SearchForm System.Web.UI.HtmlControls.HtmlForm 720754 0
        _ctl4 System.Web.UI.LiteralControl 181 0
        txtEmployers System.Web.UI.WebControls.TextBox 59 0
        _ctl5 System.Web.UI.LiteralControl 86 0
        txtWelderName System.Web.UI.WebControls.TextBox 61 0
        _ctl6 System.Web.UI.LiteralControl 53 0
        calBDate_outer eWorld.UI.CalendarPopup 4534 280
            calBDate System.Web.UI.WebControls.TextBox 0 132
            _ctl0 System.Web.UI.WebControls.HyperLink 0 188
        _ctl7 System.Web.UI.LiteralControl 120 0
        calDateFrom_outer eWorld.UI.CalendarPopup 4643 476
            calDateFrom System.Web.UI.WebControls.TextBox 0 132
            _ctl1 System.Web.UI.WebControls.HyperLink 0 192
        _ctl8 System.Web.UI.LiteralControl 14 0
        calDateTo_outer eWorld.UI.CalendarPopup 4573 476
            calDateTo System.Web.UI.WebControls.TextBox 0 132
            _ctl2 System.Web.UI.WebControls.HyperLink 0 192
        _ctl9 System.Web.UI.LiteralControl 45 0
        lblDateErr System.Web.UI.WebControls.Label 48 32
        _ctl10 System.Web.UI.LiteralControl 85 0
        selWelderMethod System.Web.UI.WebControls.DropDownList 775 352
        _ctl11 System.Web.UI.LiteralControl 82 0
        selMaterial System.Web.UI.WebControls.DropDownList 543 200
Avatar billede bumle90 Nybegynder
16. august 2004 - 18:30 #16
Hvad er det der Render-size?
For der bruger datagriddet afskyeligt meget ser det ud til...
Avatar billede snepnet Nybegynder
16. august 2004 - 18:37 #17
Når kontrollen renderes betyder det at det endelige html-output skrives til outputstream, og der er de klart at dit grid kommer til at fylde en del.... hvis du har 3000 rækker kommer der jo en hel del html ud.
Jeg kan se at du har en del kontroller som vil give dig et tungt viewstate - særligt dine dropdownlister og calenderpopups ser det ud til.
Avatar billede bumle90 Nybegynder
16. august 2004 - 18:42 #18
Men altså så mange er der altså heller ikke..
3 kalendere og 2 dropdowns. Det er da ikke unormalt mange....Hvis man ikke engang kan lægge det ind på en side uden der bliver lavet et gigantisk viewstate....så vil jeg sige at så skuffer asp.net mig da en smule....
Avatar billede bumle90 Nybegynder
16. august 2004 - 18:49 #19
Men okay så....Når jeg så slår viewstate fra på hele siden, kommer der ganske rigtigt heller ikke nogle brugte bytes i viewstates i trace nogle controllers.
Dog kommer der dog i følgende øvertste linie følgende:
__PAGE ASP.mainform_aspx 2365460 500276
Dette kunne jo måske godt være den der skaber hele den gigantisk lange streng i html-dokumentet?
Hvad kan det så være?
Avatar billede bumle90 Nybegynder
16. august 2004 - 18:55 #20
Og det kommer når jeg indsætter følgende i mit datagrid:
Altså de her checkboxlistes...

                        <asp:TemplateColumn HeaderText="Forlænginger">
                        <ItemTemplate>
                            <asp:CheckBoxList Runat=server ID="chklstExtensions" RepeatDirection=Horizontal EnableViewState="False">
                                <asp:ListItem />
                                <asp:ListItem />
                                <asp:ListItem />
                            </asp:CheckBoxList>
                        </ItemTemplate>
                    </asp:TemplateColumn>
Avatar billede bumle90 Nybegynder
16. august 2004 - 21:00 #21
snepnet, har du nogen ide om hvad der kan være galt?
Avatar billede snepnet Nybegynder
16. august 2004 - 21:03 #22
10 minutter... så skal jeg være der :o)
Avatar billede snepnet Nybegynder
16. august 2004 - 21:07 #23
hvorfor er det egentlig checkbox-lister du sætter ind i hver række - hvor mange checkboxe viser du i hver ?
Avatar billede snepnet Nybegynder
16. august 2004 - 21:09 #24
Eller rettere... hvor mange har du brug for ?
(jeg kan godt se du sætter en stak tomme ind)
Avatar billede snepnet Nybegynder
16. august 2004 - 21:14 #25
Det ser faktisk ikke ud til at det har nogen effekt at slå viewstate fra på checkbox-lister.....
Avatar billede snepnet Nybegynder
16. august 2004 - 21:26 #26
Har du mulighed for at benytte html-kontroller istedet ?
Avatar billede bumle90 Nybegynder
16. august 2004 - 22:29 #27
Hmmm ja...Jeg skal bruge x-antal checkboxe nemlig.
Nok højst 4, men i princippet kender jeg ikke grænsen.
Det skal være dynamisk alt efter hvad der står i databasen...Desuden skal jeg kunne lave nogle af dem readonly....måske er det bedre at lave gode gammeldags <input type=checkbox>...og så bare x-antal af dem inde i en templatecolumn.
Tror du måske ik det ville være smartere?
Avatar billede bumle90 Nybegynder
16. august 2004 - 22:32 #28
Det er nok en bug ved den list box control....
Avatar billede snepnet Nybegynder
16. august 2004 - 22:32 #29
skal brugeren kunne ændre dem, så det kan opdateres i basen ?
Avatar billede bumle90 Nybegynder
16. august 2004 - 22:45 #30
ja....hvis han trykker på en af dem skal der redirectes til en anden side...med nogle parametre
Avatar billede snepnet Nybegynder
16. august 2004 - 22:47 #31
skal brugeren redirectes hvis der trykkes på en checkbox ? - det lyder lidt specielt.
Avatar billede bumle90 Nybegynder
16. august 2004 - 22:50 #32
ja...eller dvs. han skal ha mulighed for at komme ind på en anden side hvor han kan indtaste nogle data der opdaterer noget i databasen
Avatar billede bumle90 Nybegynder
16. august 2004 - 22:51 #33
Så det er vel en form for redirect....
Avatar billede snepnet Nybegynder
16. august 2004 - 22:54 #34
ok - så kan du jo bare klaske html-kontroller ind istedet. De suger ikke viewstate (med mindre du sætter runat="server" på dem.
Avatar billede bumle90 Nybegynder
16. august 2004 - 22:57 #35
nej....hmm det er nok det smarteste...er det muligt at lægge dem ind på baggrund af en anden forspørgsel i DB?
Altså selve datagriddet er jo en forspørgsel...så det blir jo en nested forspørgsel...Hvordan klares den?
Avatar billede snepnet Nybegynder
16. august 2004 - 23:04 #36
jeg ville definere et dataset bestående af de to tabeller med relationer og hele balladen, så ville jeg skrive en stored procedure til at suge sagerne op med, og i min databinding af griddet sørge for at oprette checkboxene med værdierne fra den tabel det drejer sig om.
(altså binde griddet til tabel1, og pr. relation trække de nødvendige værdier fra tabel2 i handleren af databindevented på griddet).
Avatar billede bumle90 Nybegynder
17. august 2004 - 11:32 #37
Er det så ikke lettere at kalde en funktion der ligger i code behind som retunerer x-antal checkboxes i en lang streng. Altså html kode som bliver printet på siden.
Avatar billede bumle90 Nybegynder
17. august 2004 - 12:34 #38
okay...det er faktisk ikke nødvendigt at skulle ændre i dem.
Det er faktisk nok at se dem...
Avatar billede snepnet Nybegynder
17. august 2004 - 20:22 #39
har du prøvet med html-kontrollerne så (altså uden at de kører serverside).... de skulle ikke generere dig noget viewstate overhovedet.
Avatar billede bumle90 Nybegynder
24. august 2004 - 18:13 #40
Undskyld den bratte afslutning, men jeg har lidt for mange løse ender...Blir nødt til at lukke for nogle af alle mine spg.
Tak for hjællpen. Hvis der er lagt svar får disse point, eller er jeg nødt til at tage dem selv for at lukke alle de her spg.
Mvh.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester