[ASP.NET] Validatie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Goedemorgen medeTweakers,
Het is nu ongeveer een maand geleden dat ik voor het eerst met ASP.NET begonnen ben. Tot nu toe heb ik mij met name op het C# gedeelte gericht en dat is me tot nu toe heel goed afgegaan. Nu ik mij op het ASP gedeelte aan het richten ben zit ik toch met wat vraagjes.

Momenteel ben ik aan het nadenken over de manier waarop ik de validatie van al mijn formuliertjes wil gaan doen. Ik wil dit graag serverside gaan afhandelen, om de integriteit van mijn data te kunnen garanderen. Daarnaast zou als aanvulling het ook op clientside niveau kunnen worden uitgevoerd om het aantal page refreshes te beperken.

Na wat googelen kwam ik erachter dat asp.net hier een eigen methode voor heeft. Ook begreep ik uit de vele verhalen dat deze ook serverside kan worden uitgevoerd. Alleen zit ik met wat vragen:
  • Zover ik begreep moet je voor elk veld de foutmeldingen opgeven. Dus stel je formulier bestaat uit 10 velden, dan moet je 10x de foutmelding opgeven: Dit is een verplicht veld. Heb ik dit goed begrepen, of kan dit ook beter?
  • Wordt de foutmelding altijd naast het veld weergegeven of kan je zelf ook een plek opgeven waar je die foutmelding kan plaatsen?
Ik twijfel namelijk ook om zelf iets te schrijven. Wat ik dan in gedachte heb is om in bijvoorbeeld een hidden field required, alle velden op te geven die vereist zijn. Zo hoef ik per formulier alleen steeds een aantal hidden fields(voor required, emailvalidation,numbervalidation, etc) op te geven en de rest gaat vanzelf.
Nu is het wiel voor de tweede keer uitvinden vaak niet zo slim, dus ik vraag me af wat jullie mening is en of jullie antwoord hebben op die 2 vragen. Ik hoor graag van jullie.

BHD

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Wat betreft je punt één, volgens mij kan dat inderdaad niet handiger nee. Wat je kúnt doen is alle foutmeldingen op niets zetten en later via de code allemaal dezelfde waarde geven? Maar als het een verplicht veld is, is de 'foutmelding' meestal een '*' toch? :) Dat scheelt al in de foutmeldingen die je hoeft te schrijven natuurlijk.

Wat betreft je punt twee, kun je kijken naar een ValidationSummary control. Daarmee kun je alle foutmeldingen op een centrale plaats weergeven.

Zelf als je validatie opnieuw gaan schrijven kan natuurlijk altijd, maar waarom niet de ingebouwde tools gebruiken? De validatie zaken in ASP.net zijn vrij krachtig en ik vind ze zelf handig in gebruik. Als je daarmee echt niet uit de voeten kunt (maar zover ben jij nog niet), kun je altijd nog eigen validatie schrijven. Maar zelfs daarvoor is al iets uitgevonden, de CustomValidator. :)

Waar je overigens altijd wel even op moet letten is het ValidationGroup-attribute, vooral als je ook zaken op je pagina hebt staan die geen validatie horen te veroorzaken (bijv. een Annuleer-knop).

[ Voor 14% gewijzigd door Cloud op 08-04-2009 10:54 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Duidelijk verhaal :) Toch twijfel ik helaas nog steeds :(

1. Mede omdat ik het veel werk vind om voor ieder veld zon validatieblokje te maken.
2. Validatie van je formulier eigenlijk in de controller moet worden afgehandeld.

Erg lastig dit :(

Kan je ook binnen C# dan die validatiefuncties aanroepen, bijvoorbeeld. validateEmail(request.veld1) ofzo? en als dat kan, kan dat ook binnen javascript(a)?

[ Voor 24% gewijzigd door BlackHawkDesign op 08-04-2009 11:33 ]


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Tja, hoe je het ook wendt of keert, of je maakt voor elk veld zo'n validatieblokje, of je schrijft voor elk veld je eigen validatiecode inclusief foutmelding. Ik denk niet dat het veel werkt scheelt :)

Wat betreft punt 2, mwa, vind ik niet helemaal terecht. De ASP.net validatiecontrols controleren via javascript (indien mogelijk) client-side al of het veld valideert en daarna bij een postback ook server-side nogmaals. Afhankelijk van je gekozen validator, is de input dáárna gewoon goed te noemen. Waarom de validatie voor bijvoorbeeld een leeg veld per se in de controller plaats moet vinden, snap ik niet echt.

Maar ik herken je twijfels, ik zag er ooit ook tegenop om met die validatiecontrols aan de slag te gaan, en schreef ook altijd alles zelf. Laatst toch maar eens geprobeerd en ja, dan kost het even wat meer tijd. Maar uiteindelijk maakte ik er minder fouten door (ontbrekende validatie) en de pagina's werken veelal ook nog fijner (de meeste validatie kan client-side al gedaan kan worden) omdat er minder postbacks zijn. Of je moet van plan zijn al je eigen validatie in javascript te gaan schrijven? Mij scheelt het inmiddels een hoop werk en zorgen. :)

Anyways, zie maar wat je ermee doet ;)

edit:
Wat betreft serverside aanroep van de validatie dat kan prima inderdaad. Je kunt kijken of je gehele pagina valideert (dat wil je vaak) m.b.v.:
C#:
1
if (Page.IsValid) { ... }

Enkele controls moet ook wel kunnen, maar weet ik zo even niet te vinden. Hetzelfde geldt voor Javascript, kan ongetwijfeld maar kan ik even niet vinden. Maar als je die validatiecontrols gebruikt, dan hoef je in principe zelf de validatiemethoden niet meer aan te roepen toch? :)

[ Voor 18% gewijzigd door Cloud op 08-04-2009 11:41 ]

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Haha, gelukkig, ik was al bang dat ik de enige was die twijfelde hierover.

Bedankt cloud dat je even je gedachte er over wilde laten gaan. Ik ga even met mezelf in beraad wat ik nou precies wil gaan doen.

iig nogmaals BEDANKT!! :)

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
(nog even een pluspuntje voor de .net validatie methoden, ze checken zowel server als client side, dus iemand die javascript uitzet, of iemand die de bron van je website opslaat, edit, (javascript validatie er uit haalt) en dan met deze gemodificeerde versie uitvoert kan toch niet om de validatie heen.

(Dus de voordelen van snel client side javascript en checks zonder hele posts, en de voordeleven van serverside validatie die niet te betuttelen is in 1 :) )

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

roy-t schreef op woensdag 08 april 2009 @ 12:32:
(nog even een pluspuntje voor de .net validatie methoden, ze checken zowel server als client side, dus iemand die javascript uitzet, of iemand die de bron van je website opslaat, edit, (javascript validatie er uit haalt) en dan met deze gemodificeerde versie uitvoert kan toch niet om de validatie heen.

(Dus de voordelen van snel client side javascript en checks zonder hele posts, en de voordeleven van serverside validatie die niet te betuttelen is in 1 :) )
Mits je EXPLICIET Page.IsValid aanroept in je codebehind, anders maakt het nog weinig uit :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Bedankt jongens voor de aanvulling, scheelt weer uitzoeken :D was er net namelijk mee bezig :)

Ik vraag me af of er hier nog mensen zijn die het wel zelf doen..

[ Voor 26% gewijzigd door BlackHawkDesign op 08-04-2009 14:27 ]


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Ondertussen ben ik nu al ruim een paar uurtjes bezig om een leuk formuliertje te krijgen met validatie. Een collega heeft me het een en ander laten zien en me eerste formuliertje was in no time in elkaar. So far so good.

En toen kwam het drama: Ik wilde me foutmeldingen 'customizen'. Ik gebruik namelijk altijd een divje met een icoontje met daarnaast de foutmeldingen. Zoiets als dit: Afbeeldingslocatie: http://pccleaner.nl/files/val.jpg

Ik wilde de summary in dit divje plaatsen, echter gaat dit nou niet bepaald zonder slag of stoot. Ten eerste houdt hij zich niet aan de waarde binnen mijn divje. Hij groeit eruit naarmate er meer foutmeldingen zijn. Bovendien moet ik per summary opgeven wat de kleur is van de foutmeldingen, Ik wil dus niet steeds dit opgeven want daarvoor gebruik ik css, dus doe ik weer dubbel werk.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 22-09 14:14

Matis

Rubber Rocket

Kijk dat ziet er al lekker profi uit :Y Wat betreft css. Een divje kun je toch color: #FF0000 meegeven in je css?

HTML:
1
<div id="weetikveel" style="color: #FF0000">asdasd</div>


Weet niet precies hoe het allemaal werkt, maar IMO hoef je geen extra dubbel werk te doen ;)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Ja ik weet dat van die kleur wel aan te passen, dat is ook niet zozeer het probleem.

Alleen dit systeem moest luiheid gemak brengen, alleen doordat ik steeds dat soort dingetjes moet aanpassen, kost het me als nog bergen werk.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Ziet er inderdaad al goed uit, voor die paar uurtjes werk :)

Via Themes en Skins kun je heel veel eigenschappen van controls, en dan met name de visuele eigenschappen, al van tevoren instellen en automatisch toe laten passen.
Eventueel zou je, als je echt veel lastige aanpassingen aan je ValidationSummary moet doen, de ValidationSummary in een UserControl kunnen wrappen waarin je alles al kant en klaar maakt.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Om eerlijk te zijn was die afbeelding juist een voorbeeld hoe ik het wilde hebben. Op mijn eigen manier werkt het al, alleen kom ik er nu achter dat het nog niet gaat zoals ik wil. Het is niet helemaal 'netjes'.

Ik zit dus nu toch te twijfelen om te kiezen voor de asp.net methode, er is 1 grote maar nog over:

De summary wordt automagisch getoond wanneer er fouten zijn. Echter mijn mooie divje eromheen zoals in het plaatje niet. Hoe kan ik voor elkaar krijgen dat die ook getoond of juist niet getoond wordt? Het is namelijk geen control of kan ik die summary samenvoegen met mijn divje tot een custom control?

Als dat netjes kan zonder wat customcode kloten per formulier, dan ben ik over!

[ Voor 7% gewijzigd door BlackHawkDesign op 09-04-2009 09:33 ]


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

BlackHawkDesign schreef op donderdag 09 april 2009 @ 09:30:
[...]

De summary wordt automagisch getoond wanneer er fouten zijn. Echter mijn mooie divje eromheen zoals in het plaatje niet. Hoe kan ik voor elkaar krijgen dat die ook getoond of juist niet getoond wordt? Het is namelijk geen control of kan ik die summary samenvoegen met mijn divje tot een custom control?
[...]
Als ik het goed begrijp kun je een aantal dingen doen, het meest eenvoudig is het volgende:
HTML:
1
<div id="jouwdiv" runat="server"> ... </div>

Middels het toevoegen van de runat="server" attribute, kun je je div benaderen vanuit je code. Wat je dan bijvoorbeeld kunt doen, is in de Page_Load event controleren of de pagina Valid is en dan jouw div wel of niet tonen.

C#:
1
2
3
4
protected void Page_Load(object sender, EventArgs e)
{
   jouwdiv.visible = !Page.IsValid;
}


Dit is even een snelle gedachtensprong, maar zou volgens mij moeten werken. Op deze manier hoef je nog geen UserControl ervan te bouwen, maar dat kan natuurlijk ook. Dat behoeft alleen veel meer uitleg, dus dan zul je je eerst over het maken en gebruiken van UserControls in moeten lezen. :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Helaas werkt dat niet.

Ten eerste krijg ik een dikke foutmelding dat hij die waarde niet kan controleren omdat er geen validatie heeft plaatsgevonden. Vind ik vreemd, maar goed. Ik heb zet in css me boxje op niet zichtbaar.

Cascading Stylesheet:
1
display:none;


Daarna maak ik een aparte post functie in me pagina en doe zoiets als dit:

C#:
1
2
3
4
 protected void click(object sender, EventArgs e) {
        if (!Page.IsValid) 
            errorBox.Style["display"] = "block";
    }


Dat werkt perfect als ik mijn javascript disable. Dan vuurt hij netjes een post request af en wordt het door me c# afgehandeld die de juiste acties onderneemt. Echter werkt dit natuurlijk niet zodra in me javascript enable.

Ik ben lastig, ik weet het.. O-)

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Waarom die Javascript faalt kan ik ook zo niet zeggen. Wat is de exacte foutmelding en waar precies treedt deze op (in Javascript of juist in je code-behind file)?

Heb je misschien een stukje HTML-source met jouw divje met daarin de ValidationSummary? :)

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Het faalt niet echt in javascript, maar javascript zet mijn divje niet op display:block; Omdat ik dat ook nergens aan geef. Dus zodra ik afdwing het via de server te laten valideren gaat het goed. Dan maakt hij ook netjes mijn blokje zichtbaar. Zodra ik het via clientside ook toesta, dan gebeurd dit niet omdat ik dat javascript niet vertel.

HTML:
1
2
3
4
5
6
7
8
9
10
11
<div id="errorBox" class="message_box" runat="server">
            <div class="message_box_icon">
                <img src="../images/icons/sign_error.png" alt="error"/>
            </div>
            <div class="message_box_text">
                <p class="message_error"><strong>Fouten:</strong><br/>
                    <asp:ValidationSummary ID="errorSummary" runat="server" 
                    CssClass="message_error" ForeColor="" ondatabinding="click" 
                    DisplayMode="List" />
            </div>
        </div>


Dus ik snap wel waarom het niet goed gaat, maar niet hoe ik dit goed regel.
Ik wil dus in javascript ook kunnen aangeven van if(page.invalid) dan displayErrorbox ofzo..

[ Voor 4% gewijzigd door BlackHawkDesign op 09-04-2009 12:20 ]


Acties:
  • 0 Henk 'm!

  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 19-05 10:05
UseSubmitBehavior van je knop op false zetten ;) Dan wordt eerst javascript afgehandeld en daarna de server side code. Als het goed is.

En anders die buitenste div niet display:none in het style element zetten. Maar gewoon de property visible="false" gebruiken. Dat kan gewoon aangezien je runat="server" gebruikt.

[ Voor 40% gewijzigd door The_Ghost16 op 09-04-2009 12:22 ]


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Dat bedoel ik niet. Oke een simpele uitleg:

IK heb een div, pietje. Deze is normaal gesproken onzichtbaar. Op die pagina heb ik ook een formulier met asp validatie. Zodra ik op de submit knop ram, moet piet zichtbaar worden indien er fouten op de pagina zijn.

Extra uitleg: De validatie van asp gaat eerst via clientside(javascript) en daarna serverside(c#). Als ik in c# zeg van als er fouten zijn, laat piet dan zien. Dan komt hij er niet, want mijn javascript heeft al gezien dat er fouten zijn en stopt het post proces.

Ik kan ook zeggen, geen controle op clientside, maar dit is het laatste middel

[ Voor 7% gewijzigd door BlackHawkDesign op 09-04-2009 12:31 ]


Acties:
  • 0 Henk 'm!

  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 19-05 10:05
Oke je wilt dus client-side je div aanzetten indien de pagina invalid is.

met "if (Page_IsValid)" kun je in javascript controleren of de pagina valid is. Ik gebruik dit zelf in een endrequesthandler. Deze wordt uitgevoerd zodra de pagina volledig geladen is.

edit: En doormiddel van getelementbyid kun je de div ophalen en dan div.style.display = 'block' kun je dan de display style aanpassen.

[ Voor 20% gewijzigd door The_Ghost16 op 09-04-2009 12:37 ]


Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 20-09 15:40
Dat is inderdaad precies wat ik zoek, alleen ik krijg de melding dat die undefined is. Ik heb me ondertussen rot gezocht hoe dat komt, maar ik kan het nergens vinden?

Ook de functie Page_ClientValidate() is namelijk undefined. Volgens sommige mis ik dan webvalidation.js, echter werkt de javascript validatie wel gewoon dus volgens mij is daar niks mis mee..

Acties:
  • 0 Henk 'm!

  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 19-05 10:05
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id='jediv' style='display:none;'>
    Inhoud van de div
</div>

<script language='javascript'>
function GetDiv()
{
    if(!Page_IsValid) 
    {
        var div = document.getelementbyid("jediv");
        div.style.display = "block";
    }
}
</script>


Als je bovenstaande code gebruikt zou het moeten werken. Dan is het alleen de locatie bepalen wanneer de functie GetDiv aangeroepen wordt.
Pagina: 1