Toon posts:

[ASP.NET] Simpele user interface werkt niet goed *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met het bouwen van een ASP.NET interface met Visual Studio 2003 in C# en het .NET framwork 1.1. Vanwege de flexibiliteit van mijn interfaces ben ik programmatig (@ runtime) mijn WebControls en Validators aan het toevoegen aan de pagina.

Nu gaat er ergens iets fout, en het moet iets stoms zijn, of misschien mis ik een basisprincipe van ASP.NET, maar ik tuur me suf en kom er niet uit. Wie kan mij uit deze uitzichtloze situatie manoeuvreren?

Ik heb mijn probleem teruggebracht naar een 'simpel' voorbeeld waarbij het nog steeds fout gaat. Hieronder heb ik de code toegevoegd, maar ik leg eerst uit wat ik doe en daarna wat er fout gaat.

Wat doe ik? Ik creëer twee TextBox elementen (Firstname en Lastname) en twee RequiredFieldValidator elementen, ieder gekoppeld aan een van de TextBoxen.

Wat gaat er fout? Zodra ik in de ID properties van de Validators niks of een -niet- numerieke waarde invul (zoals "v1 of "val1"), dan geven de Validators altijd een waarschuwing in mijn HTML pagina in de browser (IE6). m.a.w. Javascript werkt wél, maar ook als ik de velden invoer krijg ik de mededeling dat de velden leeg zijn en ik kan mijn pagina nooit meer terug-posten naar de server.
Als ik echtere een -wel- numerieke waarden in de ID properties invul (zoals "3" of "4") dan wordt het clientside controle deel overgeslagen en de pagina ALTIJD gepost naar de server. Vervolgens krijg ik de pagina terug een mededeling als ik een veld ben vergeten in te vullen. Met andere woorden, de controle loopt correct, maar er is geen clientsite controle meer wat er voor zorgt dat er onnodige round-trips naar de server gemaakt moeten worden (wat ik uiteraard wil voorkomen).

Wat ik (natuurlijk) wil dat er gebeurd is dat er zoveel mogelijk clientside controle gebeurd en dat dit correct gaat. Het bestuderen van de help in VS2003, op MSDN en een speurtocht via google en discussiegroepen leverde me echter geen nieuwe informatie over de fout die ik maak. Ook het doorspitten van de WebUIValidation.js leverde niks op.


Met andere woorden: WAT DOE IK FOUT???


Dit is mijn code

WebForm2.aspx:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" 
        Inherits="WebApplication3.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
  <HEAD>
        <title>WebForm2</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  </HEAD>
    <body MS_POSITIONING="GridLayout" style="LINE-HEIGHT: normal; LETTER-SPACING: normal">
        <form id="Form1" method="post" runat="server">&nbsp;
        </form>
    </body>
</HTML>


WebForm2.aspx.cs:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
namespace WebApplication3
{
    public class WebForm2 : System.Web.UI.Page
    {
        protected System.Web.UI.HtmlControls.HtmlForm Form1;


        private void BuildUserinterface() {

            // Creating firstname textbox
            TextBox Firstname = new TextBox();
            Firstname.ID = "1";
            Form1.Controls.Add( Firstname );
            
            // Creating a required field for the firstname checkbox
            RequiredFieldValidator val1 = new RequiredFieldValidator();
            val1.ControlToValidate = Firstname.ID;
            val1.Text = "Firstname is required";
            val1.ID = "2v"; // val1.ID = "2";
            Form1.Controls.Add( val1 );

            // Adding a <br> element for layout
            Literal nextline = new Literal(); nextline.Text = "<BR>";
            Form1.Controls.Add( nextline );
            
            // Creating lastname textbox
            TextBox Lastname = new TextBox();
            Lastname.ID = "3";
            Form1.Controls.Add( Lastname );

            // Creating a required field for the lastname checkbox
            RequiredFieldValidator val2 = new RequiredFieldValidator();
            val2.ControlToValidate = Lastname.ID;
            val2.Text = "Lastname is required";
            val2.ID = "4v"; // val2.ID = "4";
            Form1.Controls.Add( val2 );

            // Adding a sumbit button
            Button button = new Button();
            button.Text = "submit";
            Form1.Controls.Add(button);
        }


        private void Page_Load(object sender, System.EventArgs e)
        {
            if ( IsPostBack ) {
                this.Validate();

                if ( this.IsValid ) {
                    //SaveChanges();
                    Response.Write( "<SCRIPT>alert('okay.');</SCRIPT>" );
                } else {
                    Response.Write( "<SCRIPT>alert('Not okay!');</SCRIPT>" );
                }
            }

        }


        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);

            BuildUserinterface();
        }
        
        private void InitializeComponent()
        {    
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
}

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Waarom ga je validaten in een postback? Daarmee roep je zelf nogmaals de validatie aan.

Voor clientside validatie is het voldoende om je knop op CausesValidation = true (default) te zetten, en je validator in te stellen op de control die gecontroleerd moet worden. Er wordt dan geen postback gedaan totdat aan de validators voldaan wordt.

My personal website


Verwijderd

Topicstarter
Waarom ga je validaten in een postback? Daarmee roep je zelf nogmaals de validatie aan.
Ik roep de this.Validate in de Page_Load aan, omdat de validate ná de Page_Load aangeroepen wordt. Ik wil zelf eventueel nog programmatige controles uitvoeren (buiten de controles van de Validators zelf) en alleen gegevens opslaan als de gegeven Valid zijn. In de Page_Load roep ik de SaveChanges() aan (in de code uitgecommentariseerd). Daarnij moet ik op dat moment dus weten of alles valide is.
Voor clientside validatie is het voldoende om je knop op CausesValidation = true (default) te zetten, en je validator in te stellen op de control die gecontroleerd moet worden. Er wordt dan geen postback gedaan totdat aan de validators voldaan wordt.
Precies, en daar gaat het tevens fout. CausesValidation en EnableClientScript staan default op true en dus wordt er gevalideerd. Waarom wordt er dan toch terug naar de server gepost?

Verwijderd

Topicstarter
O ja, de alertjes <SCRIPT>alert(..)</SCRIPT> in de Page_Load zijn puur voor testen. Correcte foutmeldingen worden verder door de Validators zelf gegeven.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Heb eens even een en ander bekeken en bij mij werkt het naar behoren:
  • niks ingevuld: beide validators miepen, geen postback
  • firstname ingevud: lastname validator miept, geen postback
  • lastname ingevuld: firstname validator miept, geen postback
  • beiden ingevuld: validators miepen niet, POSTBACK!
De enige aanpassingen die ik heb gedaan: ik heb andere namen aan de controls gegeven (deze werden bij mij niet niet geaccepteerd) en een PlaceHolder gebruikt in plaats van zelf een form declareren en die te gebruiken. Tenzij ik iets mis wat jij anders doet, zou je hiermee aan de slag moeten kunnen?

My personal website


Verwijderd

Topicstarter
ik heb andere namen aan de controls gegeven (deze werden bij mij niet niet geaccepteerd)
Welke namen heb je ze gegeven dan? Zou niet uit moeten maken denk ik, want mijn compiler mekkert verder niet.
en een PlaceHolder gebruikt in plaats van zelf een form declareren en die te gebruiken.
Wat is een placeholder? Is dat de bijbehorende html code in het HTML-design? En hoe ziet dit er bij jou dan uit?

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Een placeholder is een component dat je op een webform kunt gooien, waar je dan later dynamisch aangemaakte controls aan kunt toekenen door PlaceHolder.Controls.Add te doen ;)

De validators heb ik zo gelaten, de textbox-ID's heb ik even fname en lname gemaakt, omdat die met numerieke waardes raar gedrag vertoonden. Hij compileert inderdaad wel, maar hij runt niet helemaal zoals het hoort.

P.S. Met het form werkt hij hier nu ook naar behoren, dus daar ligt het niet aan.

[ Voor 8% gewijzigd door OZ-Gump op 18-01-2005 13:26 ]

My personal website


Verwijderd

Topicstarter
De validators heb ik zo gelaten, de textbox-ID's heb ik even fname en lname gemaakt, omdat die met numerieke waardes raar gedrag vertoonden.
Krijg nou wat, ik zie het nu ook. Het probleem lag bij de numerieke waardes van de TextBoxen. En nu snap ik ook meteen waarom. De RequiredFieldValidatorEvaluateIsValid functie uit de WebUIValidation.js (meegeleverd door .NET) haalt de Control op met de document.all[id] functie. Zodra id dus numeriek is, werkt dit als een index, inplaats van een name->value paar, waardoor er (natuurlijk) niks meer van klopt, omdat er een heel ander control opgehaald wordt.

Mijn dank is groot.

Een vraag nog: wat kan een rede zijn om een placeholder te gebruiken inplaatsvan een form (zoals ik nu heb gebruikt)?

[ Voor 10% gewijzigd door Verwijderd op 18-01-2005 13:38 . Reden: vraagje toegevoegd. ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Een placeholder is eigenlijk een soort literal waar al form-tags omheen staat. Het grote voordeel van placeholders (volgens mij) is dat het grafisch gezien (in de Visual Studio IDE) makkelijker is om er omheen te designen in je pagina.
Ik weet verder niet of er extra voordelen te halen zijn uit het gebruik van een placeholder.

Als je even snel door de members van de placeholder heenloopt, kun je zien dat het ding bijvoorbeeld een eigen viewstate van zichzelf en de daarbij behorende controls kan bijhouden. Maar dat lijkt me nou geen decisionmaker.

My personal website


Verwijderd

Topicstarter
Als je even snel door de members van de placeholder heenloopt, kun je zien dat het ding bijvoorbeeld een eigen viewstate van zichzelf en de daarbij behorende controls kan bijhouden. Maar dat lijkt me nou geen decisionmaker.
Nee inderdaad. Die viewstate is overgeërd van Control net zoals bij HtmlForm. Dus wat dat betreft is er geen verschil.
Pagina: 1