Toon posts:

[asp.net 2.0] viewstate probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een eenvoudig gridje met de volgende code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
                <asp:GridView ID="dgProducts" runat="server" AutoGenerateColumns="False" OnRowCreated="dgProducts_RowCreated">
                    <Columns>
                        <asp:BoundField DataField="ProductId" HeaderText="ID" ReadOnly="True" />
                        <asp:BoundField DataField="Name" HeaderText="Name" />
                        <asp:BoundField DataField="Model" HeaderText="Model" />
                        <asp:TemplateField HeaderText="Attributes" ShowHeader="False">
                            <ItemTemplate>
                                <asp:Button ID="btnAttributes" runat="server" CausesValidation="false" CommandName="" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:CommandField ShowSelectButton="True" />
                    </Columns>
                </asp:GridView>


om de text van de button te bepalen gebruik ik de RowCreated event in my code behind:

C#:
1
2
3
4
5
6
7
    protected void dgProducts_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (dgProducts.DataSource != null)
            if (e.Row.RowType == DataControlRowType.DataRow)
                ((Button)e.Row.Cells[3].FindControl("btnAttributes")).Text = string.Format("Attributes [{0}]", GetAttributeCount(((ProductEntity)e.Row.DataItem).ProductId));
        
    }


Echter, als ik nu de select button klik, komen alle kolommen terug uit de viewstate, maar bovenstaand event werkt niet omdat e.Row.DataItem dit keer null is.

Nu wil ik toch niet voor elke postback de data source opnieuw binden, moet ik handmatig de teksten in de viewstate opslaan en via de if (dgProducts.DataSource != null) controlleren ofdat ik mijn gegevens uit de datasource moet halen danwel de viewstate?

Alvast bedankt.

Verwijderd

De viewstate slaat -zover ik weet- alleen de properties op van een klasse. Dit is in framework 1.1 zo tenminste, ik neem aan dit ook in 2.0 zo is. Dus je moet zelf iets creatiefs zoeken ben ik bang. :*)

  • Dennis van der Stelt
  • Registratie: Januari 2000
  • Laatst online: 06:48
In 1.1 kun je alles in je viewstate plaatsen wat je wil. En wat je wil is NIETS in de viewstate plaatsen!

Er zijn altijd uitzonderingen, maar zéker data in de viewstate zetten is uit den bozen. Als je niet elke keer de data uit je database ofzo wilt halen, ga dan cachen. Maar sla alsjeblieft data niet in je viewstate op! Dat is allemaal data die in je HTML komt en de gebruiker naar zich toe geslingerd krijgt. Er zijn wel betere manieren om handig om te gaan met data.

Tenzij je data niet wijzigt, kun je het cachen. Is het een integer waarde ofzo, sla het op in een session of hidden field. Gebruik je data die veel wijzigt, of waarvan je alleen de laatste versie wilt hebben, haal het uit je database. Let wel dat je soms met 2 seconden cachen op héél druk bezochte sites al leuke performance winsten kunt halen. Maar dat moet je uiteraard allemaal testen.

Maar vermijd liever je viewstate. Ik ontwikkel websites voor m'n werk en heb dat nog nooit gebruikt. Wel één keer gezien dat username & password van een user daar werden opgeslagen. Dat deed een architect. Is maar goed dat ik zijn manager niet ben! Ha! ;)

Doe maar gewoon, dan doe je al gek genoeg.