Aangezien ik altijd PHP developer ben geweest heeft ASP.NET mij al vrij vaak achter de oren doen krabben door de totaal andere manier van werken. (OOP daargelaten.) Maar hier kom ik dus echt even niet uit. Ik doe ergens iets grandioos verkeerd, maar na het lezen van diverse artikelen over dit onderwerp ben ik niets wijzer over het hoe en wat van de ViewState.
De situatie:
Een GridView met daarin een heleboel records, voor het gemak personen. Al de rijen zijn voorzien van CommandFields met een View, Edit en Delete knop.
Als de gebruiker op de Editknop klikt bijvoorbeeld, dan wordt deze actie opgevangen door het RowCommand event en wordt de selectedIndex in een sessievariabele gezet, en de gebruiker doorgestuurd naar een andere pagina, Edit.aspx. Hier worden de gegevens van die persoon opgehaald en in een formulier gezet om te kunnen bewerken.
Het initiële probleem:
Er werken nogal wat gebruikers tegelijkertijd met die applicatie en het volgende kan dus voorkomen:
De initiële oplossing:
Geen gebruik maken van het RowCommand event met selectedIndex, maar op de Editknop een onClientClick javascriptje hangen die verwijst naar Edit.aspx met daarin de ID van de persoon in de QueryString.
An sich werkte dit goed, ook al kon ik niet goed begrijpen waarom dat de initiële functionaliteit niet goed werkte. Zou dat standaard echt zo slecht werken met meerdere gebruikers?
De problemen bleken hier echter niet mee opgelost te zijn.
Het huidige nieuwe probleem:
Aangezien ik nog niet erg lang met ASP.NET (in C# overigens) werk zal ik wel iets totaal over het hoofd zien, maar op het moment lijkt het er voor mij op dat de ViewState gedeeld is tussen meerdere gebruikerssessies. Iets waar ik met m'n hoofd niet bij kan, want dit is echt een security issue van de hoogste plank, en het brengt (zoals je merkt) erg veel ongewenste 'functionaliteit' mee.
Wat ik dus al heb geprobeerd is de ViewState volledig uitschakelen (in de Web.Config), maar dit heeft niets geholpen, er gebeurt nog steeds hetzelfde.
Daarnaast heb ik artikelen gevonden waarin wordt uitgelegd hoe ik zelf kan zorgen dat de ViewState op een andere manier wordt opgehaald en opgeslagen, maar ik weet dus niet eens zeker of mijn probleem hier überhaupt wel ligt, aangezien ik op sommige plekken ook weer lees dat de ViewState juist niet persé zorgt voor het bewaren van gegevens in bijvoorbeeld tekstvelden.
Ik wil dus juist voorkomen dat er iets gedeeld wordt tussen verschillende sessies! Iedereen moet in zijn of haar eigen sessie met de globale lijst van personen kunnen werken en niet ineens de persoon van een ander in beeld krijgen tijdens het bewerken van een persoon.
Sorry voor de n00bvraag wellicht, maar ik hoop dat ik mijn problemen duidelijk genoeg heb uiteengezet zodat iemand mij hiermee zou kunnen helpen, of in ieder geval even mee kan kijken.
De situatie:
Een GridView met daarin een heleboel records, voor het gemak personen. Al de rijen zijn voorzien van CommandFields met een View, Edit en Delete knop.
Als de gebruiker op de Editknop klikt bijvoorbeeld, dan wordt deze actie opgevangen door het RowCommand event en wordt de selectedIndex in een sessievariabele gezet, en de gebruiker doorgestuurd naar een andere pagina, Edit.aspx. Hier worden de gegevens van die persoon opgehaald en in een formulier gezet om te kunnen bewerken.
Het initiële probleem:
Er werken nogal wat gebruikers tegelijkertijd met die applicatie en het volgende kan dus voorkomen:
- Gebruiker A roept overzicht personen op
- Gebruiker B voegt een nieuw persoon toe (die wordt dus aan het overzicht toegevoegd)
- Gebruiker A klikt op Edit bij een bepaalde persoon (zonder de pagina te refreshen)
- Gebruiker A krijgt een heel andere persoon in Edit.aspx te zien omdat de volgorde van gebruikers in het grid is veranderd zonder dat hij het heeft gemerkt.
De initiële oplossing:
Geen gebruik maken van het RowCommand event met selectedIndex, maar op de Editknop een onClientClick javascriptje hangen die verwijst naar Edit.aspx met daarin de ID van de persoon in de QueryString.
An sich werkte dit goed, ook al kon ik niet goed begrijpen waarom dat de initiële functionaliteit niet goed werkte. Zou dat standaard echt zo slecht werken met meerdere gebruikers?
De problemen bleken hier echter niet mee opgelost te zijn.
Het huidige nieuwe probleem:
- Gebruiker A komt op Edit.aspx en gaat aan de slag met de persoonsgegevens.
- Gebruiker B klikt een andere persoon aan en gaat deze bewerken op de Edit.aspx pagina.
- Gebruiker A klikt op een knop die een PostBack veroorzaakt en kijkt nu in plaats van naar zijn eigen persoonsgegevens, naar de persoonsgegevens van Gebruiker B!
Oftewel, alle veldwaardes zijn vervangen door die van de persoon waar Gebruiker B op heeft geklikt.
Aangezien ik nog niet erg lang met ASP.NET (in C# overigens) werk zal ik wel iets totaal over het hoofd zien, maar op het moment lijkt het er voor mij op dat de ViewState gedeeld is tussen meerdere gebruikerssessies. Iets waar ik met m'n hoofd niet bij kan, want dit is echt een security issue van de hoogste plank, en het brengt (zoals je merkt) erg veel ongewenste 'functionaliteit' mee.
Wat ik dus al heb geprobeerd is de ViewState volledig uitschakelen (in de Web.Config), maar dit heeft niets geholpen, er gebeurt nog steeds hetzelfde.
Daarnaast heb ik artikelen gevonden waarin wordt uitgelegd hoe ik zelf kan zorgen dat de ViewState op een andere manier wordt opgehaald en opgeslagen, maar ik weet dus niet eens zeker of mijn probleem hier überhaupt wel ligt, aangezien ik op sommige plekken ook weer lees dat de ViewState juist niet persé zorgt voor het bewaren van gegevens in bijvoorbeeld tekstvelden.
Ik wil dus juist voorkomen dat er iets gedeeld wordt tussen verschillende sessies! Iedereen moet in zijn of haar eigen sessie met de globale lijst van personen kunnen werken en niet ineens de persoon van een ander in beeld krijgen tijdens het bewerken van een persoon.
Sorry voor de n00bvraag wellicht, maar ik hoop dat ik mijn problemen duidelijk genoeg heb uiteengezet zodat iemand mij hiermee zou kunnen helpen, of in ieder geval even mee kan kijken.
[ Voor 3% gewijzigd door --MeAngry-- op 26-02-2008 12:45 ]
Tesla Model Y RWD (2024)