[ASP.NET]ViewState of Hidden Input in OnInit van Page

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Ik ben bezig met een dynamisch formulier wat samengesteld wordt aan de hand van keuzes die de bezoeker in een aantal stappen maakt.

Dit dynamische formulier bouwde ik eerst op in de Page_Load functie van de pagina, maar bij een postback gaf dit problemen omdat ie aangaf dat de elementen al bestonden op de pagina. Dit omdat ik autopostback op true had gezet. Als ik autopostback echter weglaat wordt er geen postback gedaan en dat wil ik wel.

Nu las ik na wat gezoek dat het samenstellen van een dynamisch formulier slimmer is om te doen in de OnInit event van de pagina. Ik dus de code verplaatsen, maar toen kwam ik het volgende probleem tegen: De ViewState is op dat moment nog niet geladen en ik heb een waarde uit de viewstate nodig om het formulier te genereren.

Ik ben al flink aan het zoeken geweest hoe ik een waarde ala viewstate door kan passen tussen postbacks, maar ook zodat ik ze de dus al in de OnInit kan benaderen.
Ik vond alleen maar een idee om zelf een hidden input field aan te maken en die te gebruiken tussen postbacks. De waarde van dat veld is echter ook nog niet uit te lezen in de OnInit.

Een optie is om het via een Session of via de Application te doen. Dit vind ik echter beide nogal omslachtig, omdat ik dan op andere pagina's telkens een check moet laten doen of er niet waarden zijn blijven hangen die al weg mogen.

Heeft iemand misschien een idee hoe ik dit probleem op kan lossen?

Acties:
  • 0 Henk 'm!

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

gorgi_19

Kruimeltjes zijn weer op :9

Als je het echt via je viewstate wilt doen, dan moet je deze deserialen dmv LOSFormatter geloof ik. Maar wat wil je uiteindelijk bereiken? Ik vermoed dat je door middel van het half opbouwen van je controls tussendoor je controlcollection volledig overhoop gaat gooien waardoor je postbacks sowieso niet meer gaan werken.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Wat ik wil bereiken is een dynamisch gegenereerd formulier dat elke keer een postback doet wanneer er een waarde gewijzigd wordt in een control in het formulier

Acties:
  • 0 Henk 'm!

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

gorgi_19

Kruimeltjes zijn weer op :9

hornage schreef op dinsdag 12 mei 2009 @ 12:48:
Wat ik wil bereiken is een dynamisch gegenereerd formulier dat elke keer een postback doet wanneer er een waarde gewijzigd wordt in een control in het formulier
Meest eenvoudige en snelste is via een querystring de boel op te bouwen en via een request.form deze uit te lezen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Maar dan moet ik die querystring vullen in de aanroep van de postback ofzo? Ik heb even zitten zoeken, maar ergens moet dus het adres wat de postback aanroept aangevuld worden met die querystring.

Ideetjes hiervoor?

Acties:
  • 0 Henk 'm!

  • ben15243
  • Registratie: September 2003
  • Laatst online: 17-09 09:11
Kun je ter verduidelijking een stukje code en de foutmelding posten die je gekregen hebt?

Dynamische opgebouwde pagina's waarbij de controls via de codebehind worden toegevoegd moeten in zijn geheel bij elke postback weer worden opgebouwd om te kunnen worden gebind door ASP.NET. De foutmelding die jij dus krijgt (dat de Controls al aanwezig zijn in de collection) zou dus eigenlijk niet moeten voorkomen omdat bij elke postback alle dynamisch toegevoegde controls weer weg zijn.

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
De foutmelding die ik krijg bij een postback:

Multiple controls with the same ID 'Hoofdje' were found. FindControl requires that controls have unique IDs.

In de OnInit maak ik dus de controls dynamisch aan. Stukje metacode uit de oninit functie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  foreach (Property Property in Category.Properties) {
    if (Property.DataType == DataType.pdtBoolean) {
        DropDownList CtrlDropDownList = new DropDownList();
        CtrlDropDownList.ID = Property.DisplayLabel;
        CtrlDropDownList.Style["position"] = "absolute";
        CtrlDropDownList.Style["left"] = Property.DisplayCtrlX + "px";
        CtrlDropDownList.Style["top"] = (TopMargin + Property.DisplayCtrlY).ToString() + "px";
        if (Property.DisplayCtrlWidth != null)
            CtrlDropDownList.Width = Unit.Pixel(Convert.ToInt32(Property.DisplayCtrlWidth));
        if (Property.DisplayCtrlHeight != null)
            CtrlDropDownList.Height = Unit.Pixel(Convert.ToInt32(Property.DisplayCtrlHeight));
        CtrlDropDownList.Items.Add(new ListItem("Ja", "T"));
        CtrlDropDownList.Items.Add(new ListItem("Nee", "F"));
        CtrlDropDownList.Items.FindByValue(Property.DefaultValue).Selected = true;
        CtrlDropDownList.AutoPostBack = true;
        CtrlDropDownList.SelectedIndexChanged += new EventHandler(Calculate);
        TabPanel.Controls.Add(CtrlDropDownList);
        if (Property.DisplaySuffix != "")
            AddPropertySuffix(TabPanel, Property, CtrlDropDownList, TopMargin);
    }
  }

Acties:
  • 0 Henk 'm!

  • TUX2K
  • Registratie: September 2001
  • Laatst online: 17-09 12:46
Bij een postback voeg je dan opnieuw de controls toe?

Alle controls worden bij gehouden in de viewstate, dus als je die een tweede keer wilt toevoegen gaat dat niet lukken omdat ze dus al bestaan.

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Als ik er een if statement omheen zet als
code:
1
2
3
  if (!Page.IsPostBack) {
    // Add Controls
  }

krijg ik een lege pagina.....

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
TUX2K schreef op woensdag 13 mei 2009 @ 12:21:Alle controls worden bij gehouden in de viewstate, dus als je die een tweede keer wilt toevoegen gaat dat niet lukken omdat ze dus al bestaan.
Nee. Dat worden ze normaal gesproken helemaal niet. Dat zou wèl zo zijn wanneer je van de zgn. DynamicPlaceHolder third-party control (of een van z'n vele klonen) gebruik maakt, maar dat is voor ASP.NET 2.0 niet meer nodig.

Omdat ze vaak geen flauw benul hebben van hoe ASP.NET 2.0 met dynamische user controls omgaat, vallen veel mensen op DynamicPlaceHolder terug en behandelen deze als een 'golden hammer'. Dit terwijl DynamicPlaceHolder eigenlijk alleeen een overblijfsel uit ASP.NET 1.0 is, waar het framework zelf niet goed om kon gaan met dynamisch geinstantieerde user controls en viewstate.

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Kan het er misschien mee te maken hebben dat ik de controls plaats in een TabPanel die ik ook dynamisch aanmaak en dat er door de postback daar iets van blijft "hangen"?

Acties:
  • 0 Henk 'm!

  • ben15243
  • Registratie: September 2003
  • Laatst online: 17-09 09:11
Ik zie dat je de ID van de controls gelijk maakt aan Property.DisplayLabel. Is deze waarde uniek of komt dezelfde DisplayLabel meerdere keren voor? Zo ja, dan is dat je probleem.

Anders, om meer inzicht te krijgen in waar de controls worden toegevoegd, kun je een breakpoint op het entry point van de OnInit functie zetten. Daar zou de Controls collectie leeg moeten zijn (of alleen de conrols moeten bevatten die in de .ascx zelf zijn gedefinieerd).
Pagina: 1