[ASP.NET C#]If statement icm Reguliere expressie wil niet

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

  • Razr
  • Registratie: September 2005
  • Niet online
Ik ben bezig om een inlog-naam en een wachtwoord te checken wanneer deze zijn gesubmitted.

Nu wil ik deze twee velden apart checken met een reguliere expresse. En ik ben echt nog totaal n00b op het gebied van ASP.NET en C#. Ik kom namelijk van PHP af (kon redelijke mee overweg).

Ik had de volgende code bedacht:

C#:
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
//Gebruiker wil gaan inloggen
//Server-side velden checken
//variable voor error-code declareren en op 0 zetten (=geen fouten)
int error = 0;
              
//reguliere expressie zetten; letters en cijfers en tussen de 3 en 25 tekens  
Regex inlogControle = new Regex(@"^[\w]{3,25}$");

//Als er geen match is dan een foutcode zetten
if (inlogControle.IsMatch(inlogNaam.Text) == false)
{
    error = 3;
}

//Hier weer een expressie zetten
Regex wachtwoordControle = new Regex(@"^[\w]{4,12}$");

//Als er geen match is dan een foutcode zetten
if (wachtwoordControle.IsMatch(wachtwoord.Text) == false)
{
    error = 8;
}

//Als er een error code is gezet word de gebruiker doorgestuurd naar een pagina die aan de
//hand van een SWITCH statement een foutmelding laat zien.                
if (error != 0)
{
    Response.Redirect("error.aspx?error=" + error, true);
}

//velden kloppen, verder met inloggen
//rest van de code hieronder


Maar nu doet deze code dus niet wat ik wil. Hij zet altijd een error, ook al weet ik zeker dat ik de expressie match. Om dit te testen heb ik de volgende code even ipv bovenstaande code neergezet:

C#:
1
2
3
4
5
6
//Weer een expressie maken
Regex wachtwoordControle = new Regex(@"^[\w]{4,12}$");

//Nu komt er dus True of False op de pagina te staan, afhankelijk van of 
//hij match't of niet
Response.Write(wachtwoordControle.IsMatch(wachtwoord.Text));


En het rare is, dit werkt wel goed ?! Ik krijg gewoon netjes True of False te zien zoals het hoort. Ik heb ook al een andere IF statement geprobeerd

C#:
1
2
3
4
5
//Andere statement, mag ook niet baten
if (!inlogControle.IsMatch(inlogNaam.Text))
{
    error = 3;
}


Ik zie door de bomen even het bos niet meer. Ben toch nog niet zo ervaren hierin en zou graag even weten waarom dit niet werkt.

Alvast bedankt.

  • Razr
  • Registratie: September 2005
  • Niet online
Ik ben nog even aan het debuggen geweest (ik post dit in een reply, ik denk dat dat het wat overzichterlijker houdt)

Ik heb nu een stuk code erbij gezet wat een paar booleans uit gepoept en nog wat waardes van de velden. Het gaat hier om deze code:

C#:
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
//een expressie maken (zelfde als bij bovenstaande voorbeelden)
Regex testControle = new Regex(@"^[\w]{3,25}$");

//De input's van de velden uit poepen
Response.Write("Inlognaam: " + inlogNaam.Text);
Response.Write("<br />Wachtwoord: " + wachtwoord.Text);

//Het result van de functie uit poepen als boolean
Response.Write("<br />Inlognaam matcht: " + testControle.IsMatch(inlogNaam.Text));
Response.Write("<br />Wachtwoord matcht: " + testControle.IsMatch(wachtwoord.Text));

//Om uit te sluiten dat de if statements niet goed werken deze ook een string laten outputten
//bij een goed of een onjuiste match
if (!testControle.IsMatch(inlogNaam.Text))
{
    Response.Write("<br />De inlognaam matcht NIET");
}
else
{
    Response.Write("<br />De inlognaam matcht WEL");
}

if (!testControle.IsMatch(wachtwoord.Text))
{
    Response.Write("<br />Het wachtwoord matcht NIET");
}
else
{
    Response.Write("<br />Het wachtwoord matcht WEL");
}


Als ik nu in het inlognaam veld in typ: blaat en in het wachtwoord veld ook: blaat. Krijg ik de volgende output:


Inlognaam: blaat
Wachtwoord: blaat
Inlognaam matcht: True
Wachtwoord matcht: True
De inlognaam matcht WEL
Het wachtwoord matcht WEL


Dit klopt allemaal perfect. Als ik nu expres een foute inlognaam geef, dus bijvoorbeeld blaat/;. Dan krijg ik het volgende:


Inlognaam: blaat/;
Wachtwoord: blaat
Inlognaam matcht: False
Wachtwoord matcht: True
De inlognaam matcht NIET
Het wachtwoord matcht WEL


Dus dat werkt ook perfect, maar waarom werkt het in mijn andere code niet ?! Ik ga het nog maar een keer goed doorkijken want it's driving me crazy ;)

[ Voor 8% gewijzigd door Razr op 30-11-2006 22:53 ]


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

PhysicsRules

Dux: Linux voor Eenden

- welke errorwaarde zet de code in de querystring?
- Heb je deze code gecopy paste? Het ziet er op het oog goed uit

Daarnaast nog een off-topic handreiking: het is een best-practice (iig in .Net) om geen "magic numbers" te gebruiken. In plaats van error=0, error=3, error=8 kun je beter een error-enumeratie introduceren:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
public enum InlogStatus
{
     Succes = 0,
     OngeldigeNaam = 3,
     OngeligWachtwoord = 8
}

private InlogStatus MijnInlogStatus;
if (!inlognaamControle.IsMatch(InlogRegEx))
{
    MijnInlogStatus = InlogStatus.OngeldigeNaam;
}

  • Razr
  • Registratie: September 2005
  • Niet online
PhysicsRules schreef op donderdag 30 november 2006 @ 22:52:
- welke errorwaarde zet de code in de querystring?
- Heb je deze code gecopy paste? Het ziet er op het oog goed uit
Fout code 3 staat voor een ongeldige inlogNaam, en fout code 8 staat voor een ongeldig wachtwoord (als je dit bedoelt ?!).
Deze code is gecopy paste ja. Wel wat bewerkt (tabs weggehaald en wat meer commentaar toegevoegd).

En bedankt voor je tip, zou er is naar gaan kijken (ben nog onwijs onervaren dus alle tips zijn meegenomen ;) ).

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

PhysicsRules

Dux: Linux voor Eenden

Wat ik bedoelde eigenlijk is, waarnaartoe gaat je redirect. Krijg je error.aspx?error=0, error.aspx?error=3 or error.aspx?error=8

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
kijk eens naar de regularexpressionvalidator control.
Doet precies wat je wilt.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Razr
  • Registratie: September 2005
  • Niet online
PhysicsRules schreef op donderdag 30 november 2006 @ 22:59:
Wat ik bedoelde eigenlijk is, waarnaartoe gaat je redirect. Krijg je error.aspx?error=0, error.aspx?error=3 or error.aspx?error=8
Hij stuurt naar error=8, maar het ligt er gewoon aan waar de error het laatst overschreven word. Laat ik bijvoorbeeld het wachtwoord eerder controleren dan de inlognaam, dan krijg ik gewoon error=3.

Ik ben er nu wel achter gekomen dat als ik keiharde waarden invoer dat het dan wel gewoon werkt:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
int error=0

Regex inlogControle = new Regex(@"^[\w]{3,25}$");
if (!inlogControle.IsMatch("blaat"))
{
    error = 3;
}

Regex wachtwoordControle = new Regex(@"^[\w]{4,12}$");
if (!wachtwoordControle.IsMatch("blaat"))
{
    error = 8;
}


En nu krijg ik gewoon een error=0 (dus werkt het) :?

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

PhysicsRules

Dux: Linux voor Eenden

4of9 heeft helemaal gelijk, dat is veel makkelijker.

Maar het blijft vreemd dat je eerste code niet werkt.

Heb je je nieuwe testcode in een nieuwe pagina gezet, of is dit op dezelfde pagina. Misschien dat er andere problemen spelen, zoals een uitgeschakelde viewstate.

  • Razr
  • Registratie: September 2005
  • Niet online
Nee ik zet alles gewoon op dezelfde pagina. Die testcode die die output geeft had ik gewoon er boven gezet, en de 'orginele' code er uit gecomment mbv /* en */.

Ik zou wel is gaan kijken naar die control die 4of9 aangaf, maar dit moet opzich toch ook werken ?

  • bpere
  • Registratie: November 2005
  • Laatst online: 27-09-2022
[/quote]
if (wachtwoordControle.IsMatch(wachtwoord.Text) == false)
[quote]

Geeft de functie IsMatch wel degelijk een boolean terug (en geen Object).
Indien dit een object terug geeft zal de vergelijking mogelijk niet juist zijn want object <> boolean.

Daarentegen zal !wachtwoordControle.IsMatch(...) automatisch omgezet worden naar een boolean omdat deze automatisch door de compiler herkent wordt als een boolean.

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

PhysicsRules

Dux: Linux voor Eenden

bpere schreef op donderdag 30 november 2006 @ 23:45:
[/quote]
if (wachtwoordControle.IsMatch(wachtwoord.Text) == false)
[quote]

Geeft de functie IsMatch wel degelijk een boolean terug (en geen Object).
Indien dit een object terug geeft zal de vergelijking mogelijk niet juist zijn want object <> boolean.

Daarentegen zal !wachtwoordControle.IsMatch(...) automatisch omgezet worden naar een boolean omdat deze automatisch door de compiler herkent wordt als een boolean.
IsMatch geeft een boolean terug. Bovendien zal de C# compiler !object niet leuk vinden.

  • Razr
  • Registratie: September 2005
  • Niet online
Heb het IF statement ook al op deze manier gebruikt:

C#:
1
2
3
4
if (inlogControle.IsMatch(inlogNaam.text) == false )
{
    error = 3;
} 


Maar werkt ook niet. Anders had het ook niet gewerkt toen ik de waardes keihard ingesteld had. Aangezien het dan WEL werkt, ligt het denk ik aan het

C#:
1
IsMatch(inlogNaam.text)


Ik weet het ook niet meer...

[ Voor 4% gewijzigd door Razr op 30-11-2006 23:56 ]


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

PhysicsRules

Dux: Linux voor Eenden

Waar wordt deze code aangeroepen?

  • Razr
  • Registratie: September 2005
  • Niet online
In de Page_Load event, hier het bovenste gedeelte van de code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using System.Data.SqlClient;

public partial class _default : System.Web.UI.MasterPage
{

    protected void Page_Load(object sender, EventArgs e)
    {
        //Gebruiker in of uitloggen
        string actie = Request.QueryString["actie"];
        switch (actie)
        {
            case "inloggen":
                //Hier onder begint de code die in de ts staat


En dit zal waarschijnlijk wel alles zijn behalve OOP :+ (ik denk ik zeg het zelf vast). Want daar moet ik me nog even in verdiepen.

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

PhysicsRules

Dux: Linux voor Eenden

het gevoel bekruipt mij toch dat er iets mis gaat in de life-cycle van je pagina. Ik vermoed op basis van de info die je gegeven hebt dat je in het formulier met de inputboxes zelf de submit hebt gedefinieerd, en geen gebruik van PostBacks maakt. Dit kan ervoor zorgen dat niet alle data tussen de verschillende requests goed behouden blijft en daarom onverwachte effecten veroorzaakt.

  • Razr
  • Registratie: September 2005
  • Niet online
PhysicsRules schreef op vrijdag 01 december 2006 @ 08:16:
het gevoel bekruipt mij toch dat er iets mis gaat in de life-cycle van je pagina. Ik vermoed op basis van de info die je gegeven hebt dat je in het formulier met de inputboxes zelf de submit hebt gedefinieerd, en geen gebruik van PostBacks maakt. Dit kan ervoor zorgen dat niet alle data tussen de verschillende requests goed behouden blijft en daarom onverwachte effecten veroorzaakt.
Hier onder de opbouw van het gebeuren waar de gegevens geinput worden en verstuurd:

HTML:
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
<table align=center cellspacing=0>
    <tr>
        <td rowspan="2">
            <p>Heb je nog geen account? <br /> Klik dan <a href=registreren.aspx>hier</a>.</p>
        </td>
        <td>
            <asp:TextBox ID=inlogNaam runat=server></asp:TextBox>
        </td>
        <td align=left>
            Inlog Naam
        </td>
    </tr>
    <tr>
        <td>
            <asp:TextBox ID=wachtwoord TextMode=Password runat=server></asp:TextBox>
        </td>
        <td align=left>
            Wachtwoord
        </td>
    </tr>
    <tr>
        <td>
        </td>
        <td align=center> 
            <asp:Button ID=LoginSubmit Text="Inloggen" PostBackUrl="~/Default.aspx?actie=inloggen" runat=server />
        </td>
        <td>
        </td>
    </tr>
</table>


Ik kan hier ook niet zo snel een fout in ontdekken? Maar misschien zie ik iets over het hoofd..
Pagina: 1