Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Validation control met childcontrols

Pagina: 1
Acties:

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Ik heb een server control die inherit van BaseValidator. Van daaruit is er een Text property waarin tekst geschreven kan worden die getoond wordt zodra de evaluateisvalid functie false returned.

Daarnaas is er een Infotip control. Een server simpel server control die een img rendered (een blauwe cirkel met een witte i erin) met als mouseover een info ballonnetje (div)

Nu wil ik die functies samenvoegen. Ik wil dus die Infotip control toevoegen aan de controls collection van die validator, zodat de infotip getoond wordt zodra het invoerveld niet aan de voorwaarden van de validator voldoet.

Zoiets:
ASP.NET C#:
1
2
3
4
<asp:TextBox runat="Server" ID="txtWachtwoord" />
<tag:SomeValidator runat="server" ID="SomeValidator1" ControlToValidate="txtWachtwoord" ValidationExpression="$.{6,}^">
    <tag:Infotip Type="Information" Text="Uw wachtwoord moet minimaal 6 karakters bevatten" />
</tag:SomeValidator>


Wat dan resulteert in:
HTML:
1
2
3
4
<input name="txtWachtwoord" type="text" id="txtWachtwoord" />
<span id="SomeValidator1" style="visibility:hidden;">
    <img src="..." onmouseover="ShowTooltip('Uw wachtwoord moet minimaal 6 karakters bevatten');" onmouseout="HideTooltip();">
</span>


Hoe krijg ik die validator zo ver dat hij in de designer die Infotip als childcontrol accepteert in zijn eigen Controls collection ? Als ik namelijk een breakpoint zet in een van de render methods van de validator en ik kijk in de controls collection, dan is deze leeg.

Het lijkt er dus op dat de BaseValidator waar ik van herit niet als control container (of inamingcontainer of iets dergelijks) gebruikt kan worden.

Alvast bedankt voor wat hulp in de goede richting.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Dat klopt. BaseValidator verwacht geen child controls. Er zit dus niets anders op dan voor jouw SomeValidator control een designer te schrijven (De AjaxControlToolkit bevat een aantal zeer goed leesbare designers). De child controls kun je het beste in een template plaatsen (ITemplate). Daarna kun je de RenderControl overriden om daarna de template te presenteren.

Handleidingen, tutorials en andere artikelen hierover kun je terug vinden op de Microsoft MSDN website.

If it isn't broken, fix it until it is..


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Niemand_Anders schreef op dinsdag 19 februari 2008 @ 14:23:
Dat klopt. BaseValidator verwacht geen child controls. Er zit dus niets anders op dan voor jouw SomeValidator control een designer te schrijven (De AjaxControlToolkit bevat een aantal zeer goed leesbare designers). De child controls kun je het beste in een template plaatsen (ITemplate). Daarna kun je de RenderControl overriden om daarna de template te presenteren.

Handleidingen, tutorials en andere artikelen hierover kun je terug vinden op de Microsoft MSDN website.
BaseValidator inherit van Control en heeft daarom een ControlCollection, dus hoezo 'verwacht' deze geen child controls ? Het enige dat moet gebeuren is mijn custom validator control zodanig aanpassen dat deze de syntax in de designer 'snapt' en z'n content (de code tussen de tags van de servercontrol) interpreteert als childcontrols.

Een bakje koffie halen deed wonderen.. ik bedacht me net dat ik zoiets al eens vaker bij de hand heb gehad toen ik een container control opbouwde vanaf 'scratch' zeg maar (inherit van de WebControl class dus met weinig bestaande render logica).

code:
1
2
3
4
5
[PersistChildren(true), ParseChildren(false)]
public class SomeValidator : BaseValidator
{
    ....
}


Dit werkt prima, de PersistChildren zorgt ervoor dat de controls tussen de tags van de validator control als childcontrols behouden blijven, de ParseChildren zorgt ervoor dat de code tussen de tags niet gezien wordt als property's van de validatorcontrol.

Ik moet nog even uitzoeken of ik nog INamingContainer moet implementeren om straks geen gezeur te krijgen met m'n ID's, maar ik heb nu iig OnRender de beschikking over een Controls collection.

Verder ben ik niet zo'n fan van die AjaxControlToolkit. Het is nog wel eens grappig om er doorheen te lopen en wat ideeën op te doen, maar het is verder een draak van een toolkit die in een productieomgeving niet gebruikt zou moeten worden.

[ Voor 28% gewijzigd door Mephix op 19-02-2008 14:47 ]