[ASP] UpdatePanel alternatief? Performance verbeteren!

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi allemaal,

Ik ben bezig met een eigen framework voor portal websites. De hele website wordt op basis van een database gegenereerd en opgezet qua layout. Ik gebruik een page, met daarin een template die de place holders bevat waar mijn user controls op komen. De user controls worden door de template geladen en in de juiste place holder geplaatst.

Voordat mijn controls op de template komen, worden ze eerste gelanden in een control container die een edit, delete, minimize etc knop heeft (zegmaar een shell van de functionele control zelf). Alles gaat prima wat betreft het laden, het ondervangen van de postbacks etc.

Het probleem is echter wel in de performance na de postbacks. Voorbeeld: Control 1 heeft een grid view en een knop. Als ik op die knop klik, wordt met AJAX de content veranderd van die control wat ik ook wil... Alleen, omdat ook andere dynamische controls geplaatst zijn op dezelfde pagina, duurt het wel een tijdje, omdat ASP de andere controls opnieuw aan het laden is en de ViewState informatie aan het doornemen is voor alle controls op de pagina.

Wat ik wil is een methode om bij een postback binnen mijn control container, daar ook af te vangen zonder dat andere controls en de pagina daar last van hebben. Wat ik jammer vindt is dat met UpdatePanel dit niet mogelijk is. Na een postback van welk control dan ook, worden alle componenten opnieuw geladen.

Zijn hier alternatieven voor? Ik heb het volgende gevonden: http://www.codeproject.com/KB/ajax/PartialUpdatePanel.aspx

Het is een zeer interssant component die doet wat ik wil, behalve dat het niet werkt met doorgeven van controls. Dit component vraagd naar de locatie van een control, maar dat is in mijn geval niet voldoende, omdat ik ook parameters zoals DatabaseID's en de container instance mee moet geven. Het zou mooi zijn als iemand een soortgelijke component kent, met de mogelijkheid om het volgende te doen:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' [...]

' Dynamisch laden van mijn control:
Dim lMyControl As GadgetControl = LoadControl("~/Controls/MyControl.aspx")

With lMyControl
   .ID = content.ID      ' Database id van de content (control kan meerdere malen gebruikt worden)
   .InitContainer(Me)   ' Doorgeven van de content container
End With

' Dit kan niet met het component:
PartialUpdatePanel.UserControl = lMyControl

' Dit wel, maar is niet handig voor dynamische controls
PartialUpdatePanel.UserControlPath = "~/Controls/MyControl.aspx"


De InitContainer() zorgt ervoor dat de geladen control weet welke container gebruikt wordt. Zo kan ik na een Edit, de OnEdited() functie aanroepen in mijn container en eventuele verdere code.

Ik hoor graag of jullie tips/suggesties hebben hoe ik dit probleem kan oplossen. Het gaat dus puur om de performance te verbeteren en mijn controls afzonderlijk te laden (populaten) nadat de pagina is geladen.

Alvast bedankt,

Sead

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Je kunt beter de complete asp.net ajax bende bypassen en een library zoals jQuery o.i.d. tegen asmx web services aan laten praten. Veel meer lean-and-mean dan dat zul je het niet krijgen. (Heb ik eerder gedaan met een rich client applicatie en scheelde inderdaad een slordige factor 10...)

De extra clientside viewstate management plus het feit dat serverside nog steeds een complete page request afgehandeld wordt maakt dat je gewoon compleet geen snelheidswinst hebt. De niet gebruikte stukjes post data worden nl. door de serverside ajax handler terug toegevoegd met hun vorige waarde (uit viewstate) voordat het normale asp.net postback mechanisme in werking treed, wat weer je complete pagina helemaal doorloopt. Achteraf worden niet gebruikte stukken van de output weer weggehaald voordat het clientside bij te werken HTML segment naar de browser gaat. (In oude betas van de ajax toolkit was het zelfs zo erg dat deze output filtering pas clientside gebeurde en je dus óók nog eens hele pagina's over de lijn zat te versturen.)

Waarom überhaupt al die extra state management als je alles al asynchroon doet en je 'state' dus eigenlijk al in draaiend javascript bewaard blijft. Het hele postback model van de ajax control toolkit klopt gewoonweg geen kont van...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
R4gnax schreef op maandag 05 oktober 2009 @ 15:34:
Je kunt beter de complete asp.net ajax bende bypassen en een library zoals jQuery o.i.d. tegen asmx web services aan laten praten. Veel meer lean-and-mean dan dat zul je het niet krijgen. (Heb ik eerder gedaan met een rich client applicatie en scheelde inderdaad een slordige factor 10...)

De extra clientside viewstate management plus het feit dat serverside nog steeds een complete page request afgehandeld wordt maakt dat je gewoon compleet geen snelheidswinst hebt. De niet gebruikte stukjes post data worden nl. door de serverside ajax handler terug toegevoegd met hun vorige waarde (uit viewstate) voordat het normale asp.net postback mechanisme in werking treed, wat weer je complete pagina helemaal doorloopt. Achteraf worden niet gebruikte stukken van de output weer weggehaald voordat het clientside bij te werken HTML segment naar de browser gaat. (In oude betas van de ajax toolkit was het zelfs zo erg dat deze output filtering pas clientside gebeurde en je dus óók nog eens hele pagina's over de lijn zat te versturen.)

Waarom überhaupt al die extra state management als je alles al asynchroon doet en je 'state' dus eigenlijk al in draaiend javascript bewaard blijft. Het hele postback model van de ajax control toolkit klopt gewoonweg geen kont van...
Dank voor je antwoord. Ik ben met je eens wat betreft de ajax control toolkit, voornamelijk de UpdatePanel :) De rest werkt wel redelijk.

jQuery is wel eenvoudig te gebruiken, maar dat betekend meteen dat ik custom javascrtips moet gaan schrijven voor elke type control die ik heb. Daarnaast zullen gebruikers zelf ASP User Controls moeten bouwen die aan de gestelde standaarden voldoen (interfaces etc). Mijn control container zal eigenlijk de postbacks moeten afvangen en goed regelen zonder dat dit invloed heeft op de performance van de hele website.

Ik heb nu een implementatie gedaan van het component die ik boven heb omschreven. Ik heb nu wel een veel snellere response van de server en is de load veel stabieler geworden. Ik ben nu alleen nog aan het uitvissen wat de beste manier is om mijn container mee te geven aan de control die daarbinnen ligt. Mijn idee nu is om de container id alleen mee te geven als parameter (dat component ondersteunt custom parameters) en vervolgens met de volgende code de container te vinden van de huidige control vanuit de control zelf (functie GetContainer() of zo):

Visual Basic .NET:
1
2
3
Public Function GetContainer()
   Return Me.Page.FindControl(mContainerIDParameter)
End Function


In dat geval zou ik het volgende kunnen doen in mijn event OnEdited(). Dit zou moeten werken denk ik.

Visual Basic .NET:
1
2
3
Public Sub OnEdited()
   If(Me.mContainer IsNot Nothing) Then Me.mContainer.OnEdited()
End Sub


Ik ben bezig met een refactory van het component die ik nu gebruik en zal proberen dit nog flexibeler te maken door mijn control object aan de PartialUpdatePanel door te geven in plaats van de locatie van de control die ik wil laden.

Als jullie nieuwe suggesties hebben dan hoor ik het graag.

[ Voor 17% gewijzigd door Verwijderd op 05-10-2009 16:21 . Reden: Dubelle quote :) ]