Toon posts:

[ASP.NET] Eventhandling met posten van een reactie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in ASP.NET 2.0 (VB.NET) een pagina die 1 nieuwsbericht laat zien met de daarbij horende reacties. In de page_init worden aan de hand van parameters een nieuwsbericht-object geladen en reacties-objecten in een arraylist gestopt.

In de page_load worden met behulp van deze objecten oa de reacties getoond.

Nu heb ik het volgende probleem:
Op de pagina staat standaard een texktveld om te reageren. Als de submit-button wordt ingedrukt dan volgt er een postback en wordt er een event afgehandeld voor de submit. In de submit wordt er een nieuwe reactie gemaakt die gelijk wordt opgeslagen in de database. Deze moet ik nu alsnog toevoegen aan de pagina, terwijl dit voor alle andere objecten al is gedaan. Kan dit niet anders? Ik wil wel graag gebruik blijven maken van de postback.

  • cowgirl
  • Registratie: November 2000
  • Laatst online: 17-12-2020
Het enige wat me te binnen schiet is het ophalen en tonen van de reacties later te laten plaatsvinden, na het afhandelen van het submit-event. Bijvoorbeeld in de Page_PreRender.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub BindData()
... Haal de reacties op en vul deze
End Sub

Public Sub Page_Load(...) Handles Page.Load

   If Not Page.IsPostBack Then
      BindData()
   End If

End Sub

Public Button_Click(...) Handles Button.Click

   MaakReactie()
   BindData()
End Sub


Succes :)

Verwijderd

Topicstarter
Ik had zelf overigens al wel bedacht om de arraylist opnieuw te vullen na de submit. Maar is het een gebruikelijke of goede oplossing om het tonen van de reacties pas af te handelen in bijvoorbeeld de prerender?

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

In mijn optiek gebruik je pre_render om op hte laatste moment de al bestaande pagina nog iets te tweaken. Niet om nog nieuwe inhoud toe te voegen.

Verwijderd

Topicstarter
PhysicsRules schreef op woensdag 13 december 2006 @ 14:17:
In mijn optiek gebruik je pre_render om op hte laatste moment de al bestaande pagina nog iets te tweaken. Niet om nog nieuwe inhoud toe te voegen.
Dat idee had ikzelf ook een beetje. Nu gebruik ik de load_complete. Werkt goed en lijkt me wel een logische keuze.

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Ik ben de load_complete nog niet tegen gekomen, maar het klinkt erg nuttig. Als die inderdaad na alle submit-events nog gebeurd is dat een logische plek.

Verwijderd

Topicstarter
Toch nog een vraagje.

Iedere reactie krijgt een linkbutton om de pagina te verwijderen. En nu komt weer dat punt wat ik erg slecht vind aan asp.net eventhandling op deze button werkt niet omdat deze 'dynamisch' wordt aangemaakt.

Iemand een goede oplossing, anders dan get-variabelen?

Verwijderd

Eventhandling werkt wel degelijk op dynamische linkbuttons. Heb je deze in een datagrid/gridview staan toevallig? Dan moet je namelijk er ook een DeleteCommand aanhangen. Anders wordt er inderdaad geen event gegooid.

Zie oa: http://msdn2.microsoft.co...rary/df6hth3s(vs.80).aspx

edit:
voorbeeld toegevoegd

[ Voor 20% gewijzigd door Verwijderd op 18-12-2006 15:48 ]


Verwijderd

Topicstarter
Verwijderd schreef op maandag 18 december 2006 @ 15:47:
Eventhandling werkt wel degelijk op dynamische linkbuttons. Heb je deze in een datagrid/gridview staan toevallig? Dan moet je namelijk er ook een DeleteCommand aanhangen. Anders wordt er inderdaad geen event gegooid.

Zie oa: http://msdn2.microsoft.co...rary/df6hth3s(vs.80).aspx

edit:
voorbeeld toegevoegd
Nee ik heb de linkbuttons pas aangemaakt in de load_complete. En daar heb ik een reden voor; zie berichten hierboven.

Verwijderd

Verwijderd schreef op maandag 18 december 2006 @ 15:51:
[...]

Nee ik heb de linkbuttons pas aangemaakt in de load_complete. En daar heb ik een reden voor; zie berichten hierboven.
MSDN over de LoadComplete: The LoadComplete event occurs after all postback data and view-state data is loaded into the page and all controls on the page. In order for view state to work for controls that are added dynamically, they must be added in or before the pre-render stage of the page life cycle.

De plek is dus alles behalve geschikt hiervoor, zie ook http://www.eggheadcafe.co...et-page-life-cycle-o.aspx . Hij zal in de Load moeten staan, omdat na de Load de click events ed. gevuurd worden, daarna ben je weer te laat.

Maar uit jouw commentaar maak ik op dat jij voor het plaatsen van de reacties geen repeater of iets dergelijks gebruikt? Waarom gebruik je niet de standaard controls hiervoor?

edit:
Commentaar over repeater toegevoegd

[ Voor 12% gewijzigd door Verwijderd op 18-12-2006 16:13 ]


Verwijderd

Topicstarter
Verwijderd schreef op maandag 18 december 2006 @ 16:01:
[...]


MSDN over de LoadComplete: The LoadComplete event occurs after all postback data and view-state data is loaded into the page and all controls on the page. In order for view state to work for controls that are added dynamically, they must be added in or before the pre-render stage of the page life cycle.

De plek is dus alles behalve geschikt hiervoor, zie ook http://www.eggheadcafe.co...et-page-life-cycle-o.aspx . Hij zal in de Load moeten staan, omdat na de Load de click events ed. gevuurd worden, daarna ben je weer te laat.

Maar uit jouw commentaar maak ik op dat jij voor het plaatsen van de reacties geen repeater of iets dergelijks gebruikt? Waarom gebruik je niet de standaard controls hiervoor?

edit:
Commentaar over repeater toegevoegd
Ik kan het mis hebben maar een repeater lost hier het probleem totaal niet op.

Ergens op mijn pagina worden alle reacties in panels gestopt. Daaronder zijn textvelden om een reactie toe te voegen. Om deze nieuwe reactie direct zichtbaar te maken in de postback moet het laden een het tonen van de reacties worden afgehandeld NA het opslaan, NA de control events dus.

Het probleem is nu dat iedere reactie een knop moet hebben die ook weer een event moet hebben. En dat vind asp.net niet leuk, omdat nu de control pas wordt gemaakt NA de events :(

Overigens werk ik niet altijd met standaardobjecten zoals repeater omdat deze mij minder vrijheid geven. Grappig vind ik ook altijd dat ik met een databind op een listbox meer regels nodig heb dan dat als ik het 'handmatig' doe :)

Verwijderd

Verwijderd schreef op maandag 18 december 2006 @ 16:48:
[...]

Ik kan het mis hebben maar een repeater lost hier het probleem totaal niet op.

Ergens op mijn pagina worden alle reacties in panels gestopt. Daaronder zijn textvelden om een reactie toe te voegen. Om deze nieuwe reactie direct zichtbaar te maken in de postback moet het laden een het tonen van de reacties worden afgehandeld NA het opslaan, NA de control events dus.
Ik zie niet in waarom de oplossing PhysicsRules niet geschikt zou zijn hiervoor. Dit kan gewoon afgehandeld worden op dezelfde manier als hij in zijn voorbeeld doet.

Als je caching wil, dan stop je het data object gewoon in een Session object, voegt na het opslaan je nieuwe object aan de array in de Session toe en bind deze. En dit is maar 1 van de vele oplossingen hiervoor.
Het probleem is nu dat iedere reactie een knop moet hebben die ook weer een event moet hebben. En dat vind asp.net niet leuk, omdat nu de control pas wordt gemaakt NA de events :(
Daar doel ik idd ook op en het is logisch in mijn optiek.
Overigens werk ik niet altijd met standaardobjecten zoals repeater omdat deze mij minder vrijheid geven. Grappig vind ik ook altijd dat ik met een databind op een listbox meer regels nodig heb dan dat als ik het 'handmatig' doe :)
Dan doe je toch echt iets verkeerd :?
Het is namelijk niet meer dan:
C#:
1
2
3
4
ddlListBox.DataSource = <data>
ddlListBox.DataTextField = "Name"; // Ook in te stellen in de designer, dus weer 1 regel minder
ddlListBox.DataValueField = "ID"; // Ook in te stellen in de designer, dus weer 1 regel minder
ddlListBox.DataBind(); 

Verwijderd

Topicstarter
Dan doe je toch echt iets verkeerd :?
Het is namelijk niet meer dan:
C#:
1
2
3
4
ddlListBox.DataSource = <data>
ddlListBox.DataTextField = "Name"; // Ook in te stellen in de designer, dus weer 1 regel minder
ddlListBox.DataValueField = "ID"; // Ook in te stellen in de designer, dus weer 1 regel minder
ddlListBox.DataBind(); 

[/quote]

Of zo :)
Visual Basic .NET:
1
2
3
For Each accman As Accountmanager In AccountmanagerDAO.getAccountmanagers()
      listbox.Items.Add(New ListItem(accman.name(nametype.full), accman.Id))
Next


Die accman.name verwacht weer een parameter, die je met "datatextfield" niet mee kan geven.

Anyway, die buttons nog steeds niet aan de praat. Probleem treed dus op omdat er controls wordt aangemaakt in of na een control-event. Is hier misschien toch nog een oplossing voor?

Verwijderd

Ja, de door PhysicsRules' aangedragen oplossing helemaal bovenaan met toevoeging van caching. Dat lost het probleem netjes op.

Verwijderd

Topicstarter
Verwijderd schreef op maandag 18 december 2006 @ 20:44:
Ja, de door PhysicsRules' aangedragen oplossing helemaal bovenaan met toevoeging van caching. Dat lost het probleem netjes op.
Nee die werkt dus niet... Want bij button_cick wordt er een nieuwe reactie aangemaakt. Voor die reactie moet dan in binddata een nieuwe verwijderbutton aangemaakt worden, waardoor die button niet zal werken. Ik vrees dat ik dus toch aangewezen ben op het zetten van een input field of werken met een get-variablen.

[ Voor 10% gewijzigd door Verwijderd op 18-12-2006 21:30 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:39

gorgi_19

Kruimeltjes zijn weer op :9

Wat is er eik mis met een outputcache met een VaryByParam, al dan niet met een SQLCachedependency ?

En waarom zou je dingen willen cachen in een session object? :?
Ook wordt er wel redelijk strict omgegaan met de Page_Load; je mag best controls toevoegen in de Load, maar je moet er zelf voor zorgen dat iedere request je controlcollection in orde is (en events en / of controls toevoegen in een Page.IsPostBack statement gaat idd niet echt werken)

[ Voor 71% gewijzigd door gorgi_19 op 18-12-2006 21:48 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op maandag 18 december 2006 @ 21:46:
Wat is er eik mis met een outputcache met een VaryByParam, al dan niet met een SQLCachedependency ?

En waarom zou je dingen willen cachen in een session object? :?
Ook wordt er wel redelijk strict omgegaan met de Page_Load; je mag best controls toevoegen in de Load, maar je moet er zelf voor zorgen dat iedere request je controlcollection in orde is (en events en / of controls toevoegen in een Page.IsPostBack statement gaat idd niet echt werken)
Wie zegt dat ik iets wil cachen in een session object. Voor de duidelijkheid: het laten zien van reacties is geen enkel probleem. Echter KAN ik ze pas laten zien na de control-events ivm toevoegen van nieuwe reactie. Probleem is echter dat iedere reactie ook een control moet krijgen met een event.

Ik denk dat ik het nu toch maar anders oplos. Als ik hier op GoT een reactie plaats, krijg ik ook een tijdelijke pagina te zien dat mijn reactie is geplaatst. Dit zou mijn probleem wel oplossen. Want iedere reactiepanel maak ik dan aan in de pageload. Voor een nieuwe reactie komt een tijdelijke pagina, waardoor de nieuwe reactie daarna wel gewoon zichtbaar wordt.

[ Voor 16% gewijzigd door Verwijderd op 19-12-2006 10:43 ]


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Verwijderd schreef op maandag 18 december 2006 @ 21:30:
[...]

Nee die werkt dus niet... Want bij button_cick wordt er een nieuwe reactie aangemaakt. Voor die reactie moet dan in binddata een nieuwe verwijderbutton aangemaakt worden, waardoor die button niet zal werken. Ik vrees dat ik dus toch aangewezen ben op het zetten van een input field of werken met een get-variablen.
Waarom werkt die button niet? Zorg dat je panels met reacties pas gevuld wordt NA het afhandelen van je button_click (dus in de BindData method in mijn voorbeeld).

Verwijderd

Topicstarter
PhysicsRules schreef op dinsdag 19 december 2006 @ 13:37:
[...]

Waarom werkt die button niet? Zorg dat je panels met reacties pas gevuld wordt NA het afhandelen van je button_click (dus in de BindData method in mijn voorbeeld).
ik heb te maken met twee soorten buttons: toevoegen van een reactie deze wordt al in de apsx gegenereerd. En per reactie een button om ze te verwijderen.

Om ervoor te zorgen dat de reactie direct zichtbaar is na het klikken op de toevoegbutton. Laat ik de reacties pas zien in in de page_loadcomplete. Hierdoor werken hiervan de verwijderbuttons niet.

Ondertussen heb ik het dus anders opgelost. Alles wordt al in de page_load gedaan. En in de loadcomplete vraag ik op de de actie van de pagina was, reactie toevoegen of verwijderen of nieuwsbericht toevoegen. Zodra dat het geval is maak ik alle panels invisible behalve een die wat informatie over de actie toont en voeg ik een refresh-metatag toe aan de header van de pagina. Werkt perfekt.
Pagina: 1