Avatar billede bumle90 Nybegynder
30. november 2004 - 18:03 Der er 8 kommentarer

Problem med viewstate

Jeg har en side med et antal controls som jeg opretter i min pageload og adder til nogle celler i nogle tabeller.
Disse controls skal jeg bruge værdien af når brugeren har trykket på en knap, da jeg skal bruge dem til opslag i databasen.
Problemet er at kontrollerne bliver reset ved hvert load, jeg forstår ikke helt hvorfor dette sker da jeg ellers regnede med at viewstate sørgede for at håndtere dette.
Her er koden på den side der har et problem: Håber ikke det er for uoverskueligt :)
Mvh.

using System;
using System.ComponentModel;
using System.Data;
using Oracle.DataAccess.Client;
using System.Drawing;
using System.Web;
using System.Web.SessionState;


namespace vegasonline
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Table tblSoegSteder;
        protected System.Web.UI.WebControls.Table tblSoegAutomater;
        protected System.Web.UI.WebControls.Table tblSoegBestillinger;
        protected System.Web.UI.WebControls.Button subSearch;
        protected System.Collections.Hashtable searchFormFields;//=new System.Collections.Hashtable();

        protected DAL dal=new DAL();
        //WebControlHashTable a = new WebControlHashTable
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!this.IsPostBack)
            {
                searchFormFields=new System.Collections.Hashtable();
                makeFormFields();
                makeSoegStedTabel();
                makeSoegAutomatTabel();
                makeSoegBestillingTabel();
            }
        }
        private System.Web.UI.WebControls.TableRow makeTableRow(object[] controls)//System.Web.UI.WebControls.WebControl[] controls)
        {
            System.Web.UI.WebControls.TableRow row=new System.Web.UI.WebControls.TableRow();
            System.Web.UI.WebControls.TableCell cell;
            foreach(object[] celldescription in controls)
            {
                cell=new System.Web.UI.WebControls.TableCell();
                System.Web.UI.WebControls.WebControl control=(System.Web.UI.WebControls.WebControl)celldescription[0];
                int colspan=(int)celldescription[1];
                cell.Controls.Add(control);
                cell.ColumnSpan=colspan;
                row.Cells.Add(cell);
            }
            return(row);
        }
        private void makeFormFields()
        {           
            //searchFormFields.Add("sted_name",new ForceTextbox("Navn"));
            ForceDropDownBox list=new ForceDropDownBox("Navn");
            list.DataSource=dal.getStedNames();
            list.DataTextField="MULIG";
            list.DataValueField="VAERDI";
            list.DataBind();
            //System.Diagnostics.Debug.WriteLine();
            //list.SelectionMode=System.Web.UI.WebControls.ListSelectionMode.Single;
           
            searchFormFields.Add("sted_name",list);
            searchFormFields.Add("sted_nr",new ForceTextbox("Nr."));
            searchFormFields.Add("sted_adress",new ForceTextbox("Adresse"));
            searchFormFields.Add("sted_postnr",new ForceTextbox("Postnr."));
           
            list=new ForceDropDownBox("Navn");
            list.DataSource=dal.getAutNames();
            list.DataTextField="MULIG";
            list.DataValueField="VAERDI";
            list.DataBind();
           
            searchFormFields.Add("automat_name",list);

            list=new ForceDropDownBox("Type");
            list.DataSource=dal.getAutType();
            list.DataTextField="MULIG";
            list.DataValueField="VAERDI";
            list.DataBind();

            searchFormFields.Add("automat_type",list);
            searchFormFields.Add("automat_serialnumber",new ForceTextbox("Serienummer"));
            searchFormFields.Add("order_wishDateFrom",new ForceTextbox("Ønsket dato fra"));
            searchFormFields.Add("order_wishDateTo",new ForceTextbox("Ønsket dato til"));
        }
        private void makeSoegStedTabel()
        {
            tblSoegSteder.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["sted_name"],3}}));
            tblSoegSteder.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["sted_nr"],1},new object[]{searchFormFields["sted_adress"],1},new object[]{searchFormFields["sted_postnr"],1}}));
            //tblSoegSteder.Rows.Add(makeTableRow(new object[]{}));
        }
        private void makeSoegAutomatTabel()
        {
            tblSoegAutomater.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["automat_name"],1}}));
            tblSoegAutomater.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["automat_type"],1}}));
            tblSoegAutomater.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["automat_serialnumber"],1}}));
        }
        private void makeSoegBestillingTabel()
        {
            tblSoegBestillinger.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["order_wishDateFrom"],1}}));
            tblSoegBestillinger.Rows.Add(makeTableRow(new object[]{new object[]{searchFormFields["order_wishDateTo"],1}}));
        }
       

        private void subSearch_Click(object sender, EventArgs e)
        {
            foreach(object control in searchFormFields)
            {
                Response.Write("<br>"+control.GetType());
            }
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
            subSearch.Click+=new EventHandler(subSearch_Click);
        }
        #endregion


    }
}
Avatar billede snepnet Nybegynder
02. december 2004 - 18:37 #1
hej bumle :o)
hvad mener du med at de bliver resat ? - fyldes de med værdierne fra basen - eller tømmes de ?
mvh
Avatar billede bumle90 Nybegynder
04. december 2004 - 14:07 #2
heeey snepnet :)
Godt at se dig igen...længe siden :)
Altså....De forsvinder bare helt fra grænsefladen. De eksisterer kun hvis jeg ekskverer koden der opretter dem. Altså det der står inde i if(!ispostback)
Hvordan plejer du egentlig at lave dine grænseflade....Jeg synes hurtigt det bliver uoverskueligt og besværligt med alle de serverkontrols osv.
Jeg har tænkt på kun at bygge mit websted op af en eneste aspx side kun...og på denne bliver der så vist forskellige ascx controller...alt efter hvad bruger ønsker at se.
Hvad siger du til disse ting?
Avatar billede snepnet Nybegynder
06. december 2004 - 17:53 #3
Hej bumle.... Jeg tror der er et eller andet galt med mit mailsystem... Jeg synes det er meget få mails jeg får fra eksperten i øjeblikket.
(jeg så henvisningen til denne her i naxosnaxos's spørgsmål).

Jeg skal nok kigge på det her lidt senere i aften (jeg er lige på vej ud af døren).

Vi skrives ved.

/snep
Avatar billede bumle90 Nybegynder
06. december 2004 - 20:28 #4
Kanon snep :)
Mange tak...ser frem til dine vise ord hehe
Hvis du har tid kunne jeg også godt tænke mig at diskutere n-tier modellen med dig...
Skriv lige når du er på banen :)
Avatar billede snepnet Nybegynder
06. december 2004 - 23:42 #5
Hej bumle - jeg er på banen :o)
(men nok ikke så længe).

Jeg mener ikke en tabel kan retablere sig selv udfra viewstate, så hvis du bruger sådan nogle skal du klaske dem ind hver gang (som med så meget andet når du laver dine sider dynamisk).

Mht. til generel opbygning, så går jeg normalt aldrig efter kun at have én aspx-form (som du siger bliver det hurtigt kaos), og jeg tror ikke jeg rigtig kan se fidusen i kun af have én.

Til gengæld har jeg normalt nogle baseforms der holder diverse standardfunktionalitet (ofte har jeg flere).
Afhængig af opgaven har jeg et større eller mindre kontrolbibliotek så "norm-sider" kan produceres lidt hurtigere.

Jeg synes det at have flere fysiske forms giver en ganske god mulighed for at segmentere sitet, og jeg synes ikke der er væsentlige ulemper ved det.

Jeg benytter mig dog med jævne mellemrum af custom http-handlers til særlig funktionalitet... et eksempel kunne være :
somePage.pdf >> en pdf-version af siden.

Hvilke årsager er der til at du godt kunne tænke dig kun at have én enkelt fysisk form ?

Mht. det med tiers...
Når du skriver n-tier... mener du så "bare" en logisk lagdeling af din applikation, eller mener du "rigtige" tiers som deployementgrænser ?
Det er sådan rimelig udbredt at kalde det ene for tiers og det andet for layers.... de kan sådan set godt være sammenfaldende, men det er forventeligt med tiers - at de vil kunne deployes på hver deres fysiske maskine, hvilket vanligvis kan bringe en noget øget kompleksitet på banen for at sikre kommunikation, tilstand, sikkerhed mv. mellem hvert tier.
Som udgangspunkt vil jeg mene at der skal temmelig meget til, hvis du skal gå efter en 3/n-tier model - hvorimod en 3/n-lags model vil være ganske standard (f.eks. præsentationslag, regellag og datalag).

Håber livet er godt.

Mvh
/snep
Avatar billede bumle90 Nybegynder
07. december 2004 - 00:53 #6
hey snep. godt at se dig :) Liver er skam da altid godt her på serversiden os IT-folk imellem hehe:D

"Jeg mener ikke en tabel kan retablere sig selv udfra viewstate, så hvis du bruger sådan nogle skal du klaske dem ind hver gang (som med så meget andet når du laver dine sider dynamisk)."

Ja, det har du ret i. Jeg prøvede at lave siden lidt smart istedet for at skulle erklære et hav controls oppe i toppen af koden som klassevariable. Jeg skal nok lige gennemtænke den lidt mere :)


"Til gengæld har jeg normalt nogle baseforms der holder diverse standardfunktionalitet (ofte har jeg flere).
Afhængig af opgaven har jeg et større eller mindre kontrolbibliotek så "norm-sider" kan produceres lidt hurtigere."

Jeg har også indtil nu haft en Page som alle mine pages arvede fra. Bare for at få mulighed for at genbruge en smule kode :)

"custom http-handlers"
Jeg er ikke helt med. Hvad mener du med dem?


"Hvilke årsager er der til at du godt kunne tænke dig kun at have én enkelt fysisk form ?"

Grunden til at jeg synes det kunne væres smart med kun 1 fysisk form og mange ascx-controls er at jeg mener det ville gøre grænsefladen mere dynamisk og skalérbar.
Foresstil dig du har dele af siden du gerne vil at have til at gå igen på alle sider. Andre dele af siden skal kun vises nogle gange. Nogle skal kun vises 1 gang. Alle disse ting kunne man så lave nogle controllers som skulle styre. Således at man altså på en måde gemmer sidens tilstand, og alt efter hvilken tilstand siden er i vises de rette ascx-controls. Det er faktisk lissom templates. Jeg mener bare det ville god genbrugelig kode. Faktisk er det bare komponent tankegangen igen...bare på UI. Hvad siger du til dee tanker?

Som udgangspunkt vil jeg mene at der skal temmelig meget til, hvis du skal gå efter en 3/n-tier model - hvorimod en 3/n-lags model vil være ganske standard (f.eks. præsentationslag, regellag og datalag).

Du har ret. Jeg formulerede mig dårligt. Jeg mener selvfølgelig ikke at jeg vil lave fysiske deling i min applikation. Det har jeg ikke nogen grund til. Ihvertfald ikke med denne applikation. Kan være jeg kommer til at skulle bruge det en anden god gang.
Jeg mener bare at jeg vil opdele min applikation i et generisk data access lag som håndterer databasetransperens(vælger database på baggrund af connectionstring) et applikations specifik databaselag der indeholder alle sql/stored proc navne. Altså således at man fx. har en der hedder
public System.Data.Datatable getOrders(string type) som så laver opslaget i databasen vha. sql eller stored proc.
Så ville jeg have et buisness lag som styrer al forretningslogik. Dette lag er faktisk min domænemodel som håndhæver domænespecifikke regler. Så ville jeg have nogle objectbrokers/controllers som kommunikerede mellem mit business lag og mit UI, og samtidig styrede hvilke ascx componenter der skal vises.

Så data der bliver transporteret mellem lagene bliver puttet i DataTables eller simple datatyper alt efter hvad der skal bruges.
UI kalder funktioner i controlleren som kalder videre ned til forretningslaget som kalder videre ned i applikationsspecifik data lag som kalder ned i generisk datalag, som går i databasen...og så hele vejen tilbage igen.

Puha det var en længere smøre. Håber jeg har fået skrevet det på nogenlunde forståelig dansk. Men hvad synes du om det snep?

Sov godt du :)
Avatar billede snepnet Nybegynder
17. december 2004 - 01:05 #7
hej igen bumle.... og igen en beklagelse over den sene tilbagemelding, men godt at høre at livet er godt :o)

http-handlers :
du har mulighed for at specificere dine egne handlers, som der ikke som sådan er noget specielt i.... Page er også en httphandler.
(enhver klasse der implementerer IHttpHandler er gangbar til den slags).

du kan angive i din konfigurationsfil, at du vil benytte en særlig handler, sådan her :

<httpHandlers>
    <add verb="*" path="SomeFolder/SomePage.someextension" type="SomeNameSpace.SomeHandler,SomeAssembly"/>
</httpHandlers>               

ovenstående angiver at du har en klasse SomeClass i namespacet SomeNameSpace, liggende i SomeAssembly - og den kan du så bygge op som følger :

namespace SomeNameSpace
{
    public class SomeClass : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
          // her kan du så gøre hvad der nu kunne være interessant feks:
          context.Response.Redirect(...);
        }

        public bool IsReusable
        {
          get{return true;}
        }
    }
}

ovenstående trick kræver at du i IIS'en angiver at den extension skal håndteres af aspnet_isapidll-et.
(det lyder mere kringlet end det er... det er bare properties på dit web, et tryk på konfiguration, og der kommer så et faneblad der hedder mappings.... der kan man pille ved den slags).

mht. det med den enkelte fysiske form, så synes jeg det er praktisk at segmentere sin applikation i flere fysiske forms, hvis der er flere adskildte brugerscenarier, hvilket ikke forhindrer genbrug af kontroller.
din base kan jo sætte header/footer og hvad der ellers er af generelle klodser ind.
et kontrolbibliotek, og flere fysiske forms giver også gode muligheder for at der kan sidde en der måske ikke er så skarp i at kode kontroller mv, men så tilgengæld kan fikse et lækkert layout op, og placere kontroller "på den fede" måde, lave de rigtige stylesheets etc.
sådan en layoutfætter/kusine vil få det meget vanskeligt, hvis han/hun ikke kan lukke en form op, og rette den til selv.
(det var ikke som sådan en anbefaling... men der er nogen der sætter projektgrupper op på den måde).

der kan dog være andre årsager til at man ønsker den slags, og udfra det du skriver længere nede, tror jeg du skal kigge lidt på nedenstående (hvis du ikke allerede kender den):

det er en application building block fra MS (User Interface Process Application Block), som er en implementering af et klassisk pattern (Model View Controller (MVC)).

du kan læse om den her :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/uipab-ch01.asp

og hente den her :
http://www.microsoft.com/downloads/details.aspx?FamilyId=98C6CC9D-88E1-4490-8BD6-78092A0F084E&displaylang=en

og så er det jo en meget klassisk arkitektur du beskriver, som har vist sig vældig gangbar gennem mange år - så den synes jeg absolut du skulle forsøge dig med, og så længe du ikke bestræber dig på at kunne installere lagene på forskellige servere, er det rimelig enkelt at gå til.

MS har for øvrigt frigivet adskillige application building blocks (f.eks. en dataaccess application block), og jeg er sikker på at du kan få noget ud af at kigge lidt på dem.
Du kan finde gode ting omkring dem herfra :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/uipab-ch01.asp

og der er også en ganske god liste her (med lidt småforklaringer og links) :
http://cyberforge.com/weblog/aniltj/articles/217.aspx

nå - sengetid :o)
vi skrives ved bumle - hold dig munter.

mvh
snep
Avatar billede snepnet Nybegynder
07. september 2005 - 18:26 #8
hej bumle - du får lige et svar her, hvis noget skulle have været brugbart :o)
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester