[ASP.NET] Hidden Input op OnInit()

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Ik ben bezig met een groot asp.net project in c#. Projecten kunnen worden aangemaakt in een wizard en per pagina in de wizard worden er dingen toegevoegd aan het project.

Op een gegeven moment wordt er aan de hand van de keuze van de gebruiker een pagina met allemaal controls dynamisch geladen vanuit de OnInit zodat er postbacks plaats kunnen vinden.

Bij die OnInit moet ik wel weer het project kunnen laden zodat ik weet welke controls er aangemaakt moeten worden. In de OnInit kan ik nog geen ViewStates gebruiken jammer genoeg, dus ik moest op zoek naar een alternatief.
Zonder ViewStates moet ik dus het ID van het project tussen postbacks blijven posten. Hiervoor heb ik een Hidden Input aangemaakt die ik op een gegeven moment na het doorlopen van mijn eerste wizard step het ID van het nieuwe project geef. In zie dan ook in de source dat deze input de juiste value heeft gekregen. Na de volgende postback krijg ik echter deze waarde niet terug als ik hem via FindControl of Request.Form ophaal.
Ik heb al wat getest met inputs die wel of geen runat="server" hebben. Ook dynamisch aanmaken door het aanmaken van een HtmlHiddenInput en die te plaatsen op de pagina heeft geen effect.

Van diverse pagina's waar ik op heb gegoogled begrijp ik dat bovenstaande toch echt mogelijk moet zijn dus blijkbaar mis ik ergens wat.
Een optie is ook nog om querystrings te gaan gebruiken, maar eigenlijk wil ik dat voorkomen.

Heeft iemand een idee hoe ik dit moet doen?

OnInit:
code:
1
2
3
4
5
6
7
8
9
10
11
      if (Request.Form["ProjectID"] != null) {
        int HiddenProjectID = Convert.ToInt32(Request.Form["ProjectID"]);
        Project = new Project(HiddenProjectID);
        Project.Load();
      }
      else {
        HtmlInputHidden HiddenProjectID = new HtmlInputHidden();
        HiddenProjectID.ID = "ProjectID";
        this.Controls.Add(HiddenProjectID);
        Project = new Project();
      }


Wizard1_ActiveStepChanged:
code:
1
2
3
        Project.Save(); //doet een insert en zorgt ervoor dat het nieuwe ID geset wordt.
        HtmlInputHidden HiddenProjectID = (HtmlInputHidden)Page.FindControl("ProjectID");
        HiddenProjectID.Value = Project.ID.ToString();

Acties:
  • 0 Henk 'm!

  • Capital_G
  • Registratie: Oktober 2006
  • Laatst online: 29-08 10:34
Zonder al te veel naar je probleem te kijken, je slaat het projectID op in de broncode van de gebruiker.

De gebruiker heeft dus sowieso al volledige controle over het projectID (hidden betekend niet dat hij niet aan te passen is), waarom paas je dan het ID dan niet rond in de URL?

Als de gebruiker niet het project ID mag wijzigen, dan zul je het toch echt in de ViewState of Session op moeten slaan, niet in controls.

Acties:
  • 0 Henk 'm!

  • DarthDavy
  • Registratie: Januari 2007
  • Laatst online: 06-06 16:12

DarthDavy

Excellent!

In je probleemomschrijving geef je zelf al aan wat er fout is
In de OnInit kan ik nog geen ViewStates gebruiken jammer genoeg, dus ik moest op zoek naar een alternatief.
Zonder ViewStates moet ik dus het ID van het project tussen postbacks blijven posten. Hiervoor heb ik een Hidden Input aangemaakt die ik op een gegeven moment na het doorlopen van mijn eerste wizard step het ID van het nieuwe project geef. In zie dan ook in de source dat deze input de juiste value heeft gekregen. Na de volgende postback krijg ik echter deze waarde niet terug als ik hem via FindControl of Request.Form ophaal.
Dat is volkomen normaal, omdat de viewstate nog niet geladen is. Zie ASP.NET life cycle => http://msdn.microsoft.com/en-us/library/ms178472.aspx
During page initialization, controls on the page are available and each control's UniqueID property is set. Any themes are also applied to the page. If the current request is a postback, the postback data has not yet been loaded and control property values have not been restored to the values from view state.
De value van uw hidden input wordt pas zichtbaar in de volgende stap: Load
During load, if the current request is a postback, control properties are loaded with information recovered from view state and control state.
Value op de init fase nodig. Ik raad aan om het in de sessie te steken of querystring te gebruiken.

Bier zonder alcohol is zoals een BH aan de wasdraad: het beste is eruit


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
hornage schreef op vrijdag 26 juni 2009 @ 13:15:
Op een gegeven moment wordt er aan de hand van de keuze van de gebruiker een pagina met allemaal controls dynamisch geladen vanuit de OnInit zodat er postbacks plaats kunnen vinden.

Bij die OnInit moet ik wel weer het project kunnen laden zodat ik weet welke controls er aangemaakt moeten worden. In de OnInit kan ik nog geen ViewStates gebruiken jammer genoeg, dus ik moest op zoek naar een alternatief.
Sinds asp.net 2.0 kun je dynamisch in te laden user controls gewoon plaatsen in de OnLoad ipv de OnInit. Zolang je ze herinstantieert met dezelfde waarde voor de ID property werkt dat perfect, incl. het herpopuleren van deze controls vanuit de viewstate.

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 08:50

gorgi_19

Kruimeltjes zijn weer op :9

R4gnax schreef op vrijdag 26 juni 2009 @ 15:33:
[...]


Sinds asp.net 2.0 kun je dynamisch in te laden user controls gewoon plaatsen in de OnLoad ipv de OnInit. Zolang je ze herinstantieert met dezelfde waarde voor de ID property werkt dat perfect, incl. het herpopuleren van deze controls vanuit de viewstate.
ID is niet alleen van belang, ook positie in de controlcollection. Verander je deze, dan sloop je alsnog het geheel mbt viewstate.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
gorgi_19 schreef op vrijdag 26 juni 2009 @ 16:26:
[...]

ID is niet alleen van belang, ook positie in de controlcollection. Verander je deze, dan sloop je alsnog het geheel mbt viewstate.
Klopt. Je moet inderdaad wel je control tree exact herbouwen. Daarna kun je in de afhandeling van een onchange event oid de control tree wijzigen en andere dynamisch geladen controls neerzetten, mocht je dat willen.

Was ik inderdaad vergeten er bij te zeggen.

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Ok, ik heb nu het aanmaken van mijn dynamische controls in de onload gedaan zodat ik mijn projectid mee kan nemen in postbacks.
De dynamische controls worden geladen in 1 of meerder tabs in een tabcontainer. Als ik die nu neerzet komt er na een postback een foutmelding over dat de ActiveTabIndex niet geset kan worden. Ik heb al wat gevonden wat dit oplost, maar wat me eerder zorgen baart is dat ik niet in de functie kom die ik als event handler aan de controls heb zitten. Dit is wel wat ik nodig heb.

Misschien toch via oninit doen?

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
hornage schreef op maandag 29 juni 2009 @ 16:32:
Ok, ik heb nu het aanmaken van mijn dynamische controls in de onload gedaan zodat ik mijn projectid mee kan nemen in postbacks.
De dynamische controls worden geladen in 1 of meerder tabs in een tabcontainer. Als ik die nu neerzet komt er na een postback een foutmelding over dat de ActiveTabIndex niet geset kan worden. Ik heb al wat gevonden wat dit oplost, maar wat me eerder zorgen baart is dat ik niet in de functie kom die ik als event handler aan de controls heb zitten. Dit is wel wat ik nodig heb.

Misschien toch via oninit doen?
Wat is de exacte foutmelding en wat is de exacte event?

Events die reageren op data uit een http POST (onChange, onClick, etc.) worden sowieso altijd pas aangeroepen wanneer het OnLoad stadium van de page lifecycle al voltooid is. Het niet vuren van zo'n event zal dus bijster weinig van doen hebben met het hercreeëren van de controls in OnLoad of OnInit.

Het is waarschijnlijker dat je ergens een denkfout gemaakt hebt in hoe bepaalde functionaliteit in het framework werkt.

Acties:
  • 0 Henk 'm!

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

Specified argument was out of the range of valid values.
Parameter name: value

code:
1
2
3
4
5
6
7
8
Line 123:                    if (value >= Tabs.Count)
Line 124:                    {
Line 125:                        throw new ArgumentOutOfRangeException("value");
Line 126:                    }
Line 127:                    if (ActiveTabIndex != value)


Source File: D:\Projects\CodePlex\AjaxControlToolkit\Tabs\TabContainer.cs    Line: 125

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
hornage schreef op dinsdag 30 juni 2009 @ 12:48:
De foutmelding die ik krijg is:

Specified argument was out of the range of valid values.
Parameter name: value

code:
1
2
3
4
5
6
7
8
Line 123:                    if (value >= Tabs.Count)
Line 124:                    {
Line 125:                        throw new ArgumentOutOfRangeException("value");
Line 126:                    }
Line 127:                    if (ActiveTabIndex != value)


Source File: D:\Projects\CodePlex\AjaxControlToolkit\Tabs\TabContainer.cs    Line: 125
Van TabContainer is dan ook bekend dat het prut is wanneer je deze samen met dynamische controls gaat gebruiken.

Loop eens stap voor stap door de code heen en kijk wat er gebeurd voor je die error krijgt. Deze error en het niet uitvoeren van gebonden event handlers zijn wat dat betreft eigenlijk een duidelijk signaal dat die control zelf gewoon niet goed in elkaar steekt en een potje maakt van zijn herinitialisatie uit viewstate.[/quote]

Een aantal van de 'fixes' voor die control heb ik destijds als eens nagegoogled en als je dan inderdaad ziet hoe die control van binnen opgezet is... Ooit gehoord van code smell? : [spongebob]"Deze control is VIIIIIEEESSSS, Patrick."[\spongebob]


Waarvoor heb je eigenlijk persé die TabContainer control op die manier nodig? Sterker nog: Waarom gebruik je de controls uit de AjaxControlToolkit überhaupt? Imho kun je beter iets als JQuery UI gebruiken als je met Ajax aan de slag gaat en dan 'all the way' gaan en alleen met webservices communiceren ipv de ranzige, hybride, not-a-postback oplossing die een ajax callback in allerlei troep wikkelt om deze via het normale asp.net PageHandler mechanisme af te handelen.

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
ik lees net dat tabpanels eigenlijk in oninit geladen moeten worden. Ik vind wel wat artikelen die erover gaan dat dit weer op te vangen is. Morgen even me verder in verdiepen. Werkdag weer voorbij!
Pagina: 1