À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ µ¿Àû »ý¼º
Callum Shillan
Microsoft Consulting Service
Àû¿ë ´ë»ó:
Microsoft Framework ¹öÀü 1.0 ¹× 1.1
Microsoft Visual C#
Microsoft ASP.NET
¿ä¾à: »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·Ñ¿¡ ÀÚµ¿À¸·Î Àû¿ëµÇ´Â ASP.NET À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ µ¿Àû »ý¼ºÀ» Á¦¾îÇÒ XML ±¸¼º ÆÄÀÏ »ç¿ë ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±¸¼º ÆÄÀÏÀ» »ç¿ëÇϸé Web Form °³¹ßÀÚ°¡ ºñÁî´Ï½º ³í¸® ±¸Çö¿¡ ÁýÁßÇÒ ¼ö ÀÖÀ¸¸ç, °³¹ßÀÚ¿¡°Ôµµ º¸´Ù ÀϰüµÈ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º°¡ Á¦°øµË´Ï´Ù.
ÀÌ ±â»çÀÇ ¼Ò½º Äڵ带 ´Ù¿î·ÎµåÇϽʽÿÀ.
¸ñÂ÷
¼Ò°³¿Í °í¹é
µ¿Àû À¯È¿¼º °Ë»ç ±¸¼º ÆÄÀÏ
µ¥ÀÌÅÍ ±¸Á¶
DynamicValidationManager Ŭ·¡½º
DynamicValidationManager »ç¿ë
°á·Ð
°ü·Ã ¼Àû
¼Ò°³¿Í °í¹é
À¥ °³¹ßÀÚÀÇ ºÎ´ãÀ» ´ú¾î ºñÁî´Ï½º ³í¸® ±¸Çö¿¡ ÁýÁßÇÒ ¼ö ÀÖµµ·Ï ÇÏ°í º¸´Ù Æí¸®ÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ´Â ÇÁ·¹ÀÓ¿öÅ©¸¦ ¸¸µé°í ½ÍÀº ¸¶À½¿¡¼ ÀÌ ±â»ç¸¦ ½ÃÀÛÇßÁö¸¸ ½ÇÁ¦·Î´Â ±×·¸Áö ¸øÇÑ °Í °°½À´Ï´Ù. Web Form¿¡¼ µ¿ÀûÀ¸·Î À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» »ç¿ëÇÑ´Ù´Â °³³äÀº »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ÆÀÀÇ ¼ö¸¹Àº ÁÂÀý¿¡¼ ºñ·ÔµÈ °ÍÀÔ´Ï´Ù.
¿øÈ°ÇÏ°Ô ¿î¿µµÇ´Â À¥ ÀÀ¿ë ÇÁ·Î±×·¥ ÇÁ·ÎÁ§Æ®ÀÇ °æ¿ì ¿©·¯ ÆÀ¿¡ Ã¥ÀÓÀÌ È®½ÇÇÏ°Ô ºÐ´ãµÇ¾î ÀÖ¾î °³¹ß, Å×½ºÆ®, »ç¿ëÀÚ È¯°æ µî¿¡ ¹®Á¦°¡ »ý±æ °æ¿ì Ã¥ÀÓ ¼ÒÀç°¡ ºÐ¸íÇÕ´Ï´Ù. ÀÌ ÇÁ·ÎÁ§Æ®¿¡¼´Â °ü·Ã È¸é µðÀÚÀο¡ »ç¿ë »ç·Ê ½Ã³ª¸®¿À¸¦ »ç¿ëÇßÀ¸¸ç ²Ï È¿°úÀûÀ̾ú½À´Ï´Ù. ´ÜÀÏ ¹®¼¸¦ »ç¿ëÇÏ¿© °¢ »ç¿ëÀÚ ÀÔ·Â Çʵå Á¤ÀÇ, ÀÌ Çʵ尡 »ç¿ëµÈ ȸé, ÀÌ Çʵ尡 Çʼö ÇʵåÀÎÁö ¿©ºÎ, À¯È¿ÇÑ ¹®ÀÚ, À¯È¿¼º °Ë»ç ¿À·ù ¸Þ½ÃÁö µîÀ» ÀúÀåÇß½À´Ï´Ù. µû¶ó¼ ¸ðµÎ Çù·ÂÇÏ¿© È¸é °³¹ßÀ» ½ÃÀÛÇÒ ¼ö ÀÖ¾ú°í ¸ðµç ÀÛ¾÷ÀÌ ¼øÁ¶·Ó°Ô ÁøÇàµÇ¾ú½À´Ï´Ù. ±×·±µ¥ ¹®Á¦°¡ ¹ß»ýÇϱ⠽ÃÀÛÇß½À´Ï´Ù.
¾î´À³¯ ¾ÆÄ§ ȸÀÇ¿¡¼ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ÆÀÀÌ À¯È¿¼º °Ë»ç ¿À·ù º¸°í¿¡ »ç¿ëÇÒ ¾ð¾î¸¦ º¯°æÇØ¾ß ÇÑ´Ù°í Á¦¾ÈÇß½À´Ï´Ù. ³»¿ëÀÌ ³Ê¹« ÀåȲÇÏ¿© Á¤¸®ÇÒ Çʿ䰡 ÀÖ´Ù°í Çß´ÂÁö ¾Æ´Ï¸é ±× ¹Ý´ë¿´´ÂÁö ÀÚ¼¼ÇÑ ³»¿ëÀº ±â¾ï³ªÁö ¾ÊÁö¸¸ ¿ì¸®´Â ¸ðµç ȸéÀ» ´Ù½Ã °ËÅäÇϰí À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ ErrorMesssage ¼Ó¼º°ú Text ¼Ó¼º¿¡ »ç¿ëÇÑ ¾î±¸¸¦ º¯°æÇÏ´À¶ó »ó´çÇÑ ½Ã°£À» º¸³Â½À´Ï´Ù. ÆÀÀ¸·Î ÀÏÇÏ´Ù º¸¸é ºÎ´ãÀÌ µÇ´õ¶óµµ ´Ù¸¥ ÆÀ¿øÀÇ ÀǰßÀ» ¼ö¿ëÇØ¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù.
ÀÌ·± »óȲÀº °è¼ÓµÇ¾ú°í ³ªÁß¿¡´Â °í°´°úÀÇ ÀÚ¼¼ÇÑ »ó´ãÀ¸·Î±îÁö À̾îÁ³½À´Ï´Ù. °Å±â¿¡µµ Ÿ´çÇÑ ÀÌÀ¯´Â ÀÖ¾ú°ÚÁö¸¸ ´Þ¶óÁø »çÇ×À» ´Ù½Ã Àû¿ëÇØ¾ß Çß½À´Ï´Ù. ±×·¯³ª À̹ø¿¡´Â ¸Þ½ÃÁö »öÀ» º¯°æÇϰí, Çʼö Çʵ带 ¼±ÅÃÀû Çʵå·Î ¹Ù²Ù°Å³ª ¼±ÅÃÀû Çʵ带 Çʼö Çʵå·Î ¹Ù²Ù´Â°¡ Çϸé, Çã¿ëµÇ´Â ¹®ÀÚ ÁýÇÕÀ» ¹Ù²Ù´Â µî Æ÷°ýÀûÀÎ º¯°æÀÌ °è¼ÓµÇ¾ú½À´Ï´Ù.
¿ì¸®´Â ¹º°¡ ´ëÃ¥ÀÌ ÇÊ¿äÇÏ´Ù´Â »ý°¢À» Çß½À´Ï´Ù. Æû °³¹ßÀ» ÀÔ·Â À¯È¿¼º °Ë»ç¿Í ºÐ¸®ÇØ¾ß Çß½À´Ï´Ù. ¿À·ù ¸Þ½ÃÁö »öÀ̳ª ¾î±¸ µûÀ§¸¦ °ÆÁ¤ÇÏÁö ¾Ê°í ºñÁî´Ï½º ³í¸®¸¦ ±¸ÇöÇÏ´Â ÀÏ¿¡ ÁýÁßÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÇÊ¿äÇß½À´Ï´Ù. ¶ÇÇÑ ¸ðµç ASPX ÆäÀÌÁö¸¦ º°µµ·Î º¯°æÇÏÁö ¾Ê°íµµ ½±°Ô º¯°æÇÏ°í ¼öÁ¤ÇÒ ¼ö ÀÖ´Â ÀϰüµÈ ÀÔ·Â À¯È¿¼º °Ë»ç¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Â ÇÁ·¹ÀÓ¿öÅ©°¡ ÇÊ¿äÇß½À´Ï´Ù.
ÁøÁöÇÑ Åä·ÐÀ» °ÅÄ£ ³¡¿¡ ¿ì¸®´Â ¾Æ·¡¿Í °°Àº ¹æÄ§À» Á¤Çß½À´Ï´Ù. ¿ø·¡ °¢ ÀÔ·Â Çʵ帶´Ù °ü·Ã PlaceHolder ÄÁÆ®·ÑÀÌ ÀÖ½À´Ï´Ù. PlaceHolderÀÇ ID ¼Ó¼ºÀº ±¸¼º ÆÄÀÏ·Î Àε¦½ÌµÇ¾î µ¿ÀûÀ¸·Î »ý¼ºµÇ¾î PlaceHolder¿¡ Ãß°¡µÈ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» °Ë»öÇÕ´Ï´Ù. Web FormÀÌ Å¬¶óÀÌ¾ðÆ®·Î ·»´õ¸µµÉ ¶§´Â À¯È¿¼º °Ë»ç ÄÁÆ®·Ñµµ Æ÷ÇÔµÇ¸ç Æò»ó½Ãó·³ »ç¿ëÀÚ ÀÔ·Â À¯È¿¼º °Ë»ç¸¦ ¼öÇàÇÕ´Ï´Ù. ½ÇÁ¦·Î ¸Å¿ì °£´ÜÇÕ´Ï´Ù.
ASPX ÆäÀÌÁö¿¡¼ À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ» ¸ðµÎ Á¦°ÅÇϰí PlaceHolder ÄÁÆ®·ÑÀ» »ðÀÔÇÑ ÈÄ¿¡ ±¸¼º ÆÄÀÏ Ã¤¿ì±â¸¦ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ÆÀ¿¡ Àü´ÞÇϸé Çʿ信 µû¶ó ÀÌ ÆÀ¿¡¼ º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.
¼³¸íÇϱ⿡´Â ¸Å¿ì °£´ÜÇÑ °³³äÀÌÁö¸¸ ÀÌ ±â»ç¿¡¼´Â XML ÆÄÀÏ¿¡ ÀúÀåµÈ µ¥ÀÌÅÍ¿¡ ¾×¼¼½ºÇÏ´Â µ¿¾È String »çÀüÀÇ ArrayList°¡ Æ÷ÇÔµÈ HashtableÀÇ ±¸¼º µ¥ÀÌÅ͸¦ ij½ÃÇÏ°í ¾×¼¼½º¿¡ ´ëÇÑ ¸®Ç÷º¼ÇÀ» »ç¿ëÇÏ¿© µ¿ÀûÀ¸·Î »ý¼ºÇÑ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù. ±×·¯³ª ¸®Ç÷º¼ÇÀ» »ç¿ëÇÒ °æ¿ì 󸮷®°ú ¼º´ÉÀÌ ÀúÇ쵃 ¼ö ÀÖÀ¸¹Ç·Î ½ÇÁ¦ »óȲ¿¡¼´Â ¸®Ç÷º¼ÇÀ» »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ÀÌ ±â»ç¿¡¼´Â ´ÙÀ½°ú °°ÀÌ Äڵ带 ¾à°£ ´Ü¼øÈÇϱâ À§ÇØ ¸®Ç÷º¼ÇÀ» »ç¿ëÇϰڽÀ´Ï´Ù.
µ¿Àû À¯È¿¼º °Ë»ç ±¸¼º ÆÄÀÏ
¸ÕÀú ±¸¼º Á¤º¸ ÀúÀå ¹æ¹ýÀ» °áÁ¤ÇØ¾ß ÇÕ´Ï´Ù. µ¥ÀÌÅͺ£À̽º, ¸®¼Ò½º ÆÄÀÏ, XML ÆÄÀÏ µî ¸¹Àº ¹æ¹ýÀ¸·Î ÀÌ Á¤º¸¸¦ ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼´Â ½±°Ô ÆíÁýÇϰí Á¶ÀÛÇÒ ¼ö ÀÖµµ·Ï XML ÆÄÀÏ¿¡ Á¤º¸¸¦ ÀúÀåÇϰڽÀ´Ï´Ù.
±¸¼º ÆÄÀÏÀº µÎ °³ÀÇ ¼½¼ÇÀ¸·Î ÀÌ·ç¾îÁý´Ï´Ù. ÇÑ ¼½¼Ç¿¡¼´Â ¸ðµç À¯È¿¼º °Ë»ç±â¿¡ »ç¿ëµÇ´Â °ø¿ë ¹× ±âº» ¼Ó¼º °ªÀ» Á¤ÀÇÇϰí, ´Ù¸¥ ¼½¼Ç¿¡¼´Â ÁöÁ¤µÈ »ç¿ëÀÚ ÀÔ·Â Çʵ忡 Àû¿ëÇÒ À¯È¿¼º °Ë»ç±â ¹× ¼Ó¼º Ä÷º¼ÇÀ» Á¤ÀÇÇÕ´Ï´Ù.
Defaults ¼½¼Ç
±×¸®°í ¸ðµç À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ¿¡ ´ëÇØ ¹Ýº¹µÇ´Â ¼Ó¼ºÀ» °è¼Ó ÁöÁ¤ÇØ¾ß ÇϹǷΠ±¸¼º ÆÄÀÏÀÇ Defaults ¼½¼ÇÀ» »ç¿ëÇÏ¿© ÀÌ·¯ÇÑ ¼Ó¼ºÀ» ÇÑ ¹ø ÁöÁ¤ÇÕ´Ï´Ù. Á¤ÀÇµÈ ¸ðµç À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ¿¡ ´ëÇØ "ForeColor='RED'" µîÀ» ÁöÁ¤ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÇÊ¿äÇÑ °æ¿ì ÁöÁ¤µÈ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇØ ÀÌ·¯ÇÑ ±âº» ¼Ó¼º °ªÀ» ÀçÁ¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù.
Çü½Ä¿¡ °ü°è¾øÀÌ ¸ðµç À¯È¿¼º °Ë»ç±â¿¡ °øÅëµÇ´Â ¼Ó¼º ÁýÇÕÀÌ ÀÖ½À´Ï´Ù. ¸ðµÎ ³ª¿ÇÏÁö´Â ¾Ê°ÚÁö¸¸ CssClass, ForeColor, Visible µîÀÌ ÀÖ½À´Ï´Ù. °øÅëµÇ´Â À¯È¿¼º °Ë»ç ¼Ó¼º ÁýÇÕÀÇ °æ¿ì Çü½Ä¿¡ °ü°è¾øÀÌ µ¿ÀûÀ¸·Î ¸¸µç ¸ðµç À¯È¿¼º °Ë»ç±â¿¡ Àû¿ëÇÒ ÀϹÝÀûÀÎ °ªÀÌ Æ÷ÇÔµÈ ±¸¼º ÆÄÀÏ ÇÏÀ§ ¼½¼ÇÀÌ »ý±é´Ï´Ù.
°¢ À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Çü½Ä¸¶´Ù °íÀ¯ÇÑ ¼Ó¼º ÁýÇÕ(¿¹: ValidationSummaryÀÇ ShowMessageBox ¼Ó¼º)ÀÌ ÀÖÀ¸¹Ç·Î ±âº» ¼Ó¼º °ªÀÌ Æ÷ÇÔµÈ ÇÏÀ§ ¼½¼ÇÀÌ ÇÊ¿äÇÕ´Ï´Ù.
¸¶Áö¸·À¸·Î, ÀÌ·¯ÇÑ °ªÀ» ¸Å°³ º¯¼öÈÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. °ªÀ» ¸Å°³ º¯¼öÈÇϸé RequiredFieldÀÇ ErrorMessage ±âº» ¼Ó¼º °ª Çϳª¸¦ "Please enter something for {FriendlyName}"À¸·Î ¼³Á¤ÇÏ°í ´Ù¸¥ À§Ä¡¿¡ ÇØ´ç À̸§À» Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù.
´ç¿¬È÷ ±¸¼º ÆÄÀÏÀÇ Defaults ¼½¼ÇÀº °ø¿ë ¼Ó¼º °ª°ú À¯È¿¼º °Ë»ç±â ƯÁ¤ ¼Ó¼º °ªÀÇ ÀÚ½Ä ³ëµå°¡ ÀÖ´Â XML ³ëµåÀÔ´Ï´Ù. ¾Æ·¡¸¦ º¸¸é ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
<!--
ÀÌ ¼½¼Ç¿¡´Â À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀÇ ±âº»°ªÀÌ µé¾î ÀÖ½À´Ï´Ù.
-->
<Defaults>
<!--
¸ðµç À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ¿¡ °øÅëµÇ´Â ±âº» ¼Ó¼º °ªÀÔ´Ï´Ù.
-->
<Common>
<Property name="ForeColor" value="Red" />
<Property name="Display" value="Dynamic" />
<Property name="EnableViewState" value="False" />
</Common>
<!--
ValidationSummary ÄÁÆ®·Ñ¿¡ ´ëÇÑ ±âº» ¼Ó¼º °ªÀÔ´Ï´Ù.
-->
<ValidationSummary>
<Property name="EnableClientScript-x" value="True" />
<Property name="Enabled" value="True" />
<Property name="HeaderText" value="´ÙÀ½ ¿À·ù¸¦ ¼öÁ¤ÇϽʽÿÀ." />
<Property name="ShowMessageBox" value="False" />
<Property name="ShowSummary" value="True" />
<Property name="DisplayMode" value="BulletList" />
</ValidationSummary>
<!--
Compare À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ±âº» ¼Ó¼º °ªÀÔ´Ï´Ù.
-->
<Compare />
<!--
RequiredField À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ±âº» ¼Ó¼º °ªÀÔ´Ï´Ù.
-->
<RegularExpression>
<Property name="Text" value="Çã¿ëµÇ´Â ¹®ÀÚ´Â {LegalValues}ÀÔ´Ï´Ù." />
<Property name="ErrorMessage" value="{FriendlyName}Àº(´Â) {LegalValues}(À¸)·Î¸¸ ±¸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù." />
</RegularExpression>
<!--
RequiredField À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ±âº» ¼Ó¼º °ªÀÔ´Ï´Ù.
-->
<RequiredField>
<Property name="InitialValue" value="" />
<Property name="Text" value="ÀÌ Çʵå´Â Çʼö ÇʵåÀÔ´Ï´Ù." />
<Property name="ErrorMessage" value="{FriendlyName}¿¡ ´ëÇÑ ³»¿ëÀ» ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù." />
</RequiredField>
<!--
»ç¿ëÀÚ ÁöÁ¤ Custom À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ±âº» ¼Ó¼º °ªÀÔ´Ï´Ù.
-->
<Custom>
<Property name="EnableClientScript-x" value="False" />
</Custom>
</Defaults>(Âü°í: ÇÁ·Î±×·¡¸Ó ÄÚ¸àÆ®´Â »ùÇà ÇÁ·Î±×·¥ ÆÄÀÏ¿¡´Â ¿µ¹®À¸·Î Á¦°øµÇ¸ç ±â»ç¿¡´Â ¼³¸íÀ» À§ÇØ ¹ø¿ª¹®À¸·Î Á¦°øµË´Ï´Ù.)
ValidationSummaryÀÇ ForeColor ¼Ó¼º¿¡ ´ëÇÑ ±âº»°ªÀº ´ç¿¬È÷ Common ³ëµå¿¡ ÀÖ´Â °ªÀ» ÀçÁ¤ÀÇÇÕ´Ï´Ù. ÀÌ µ¿ÀÛÀº ÀúÀý·Î ¹ß»ýÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó Äڵ忡¼ ±¸ÇöÇØ¾ß ÇÏ´Â µ¿ÀÛÀÔ´Ï´Ù.
ValidatorSets ¼½¼Ç
ÀÔ·Â À¯È¿¼ºÀ» Á¦´ë·Î °Ë»çÇÏ·Á¸é »ç¿ëÀÚ ÀÔ·Â Çʵ忡 À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ Ä÷º¼ÇÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ¾ÏÈ£ ÇʵåÀÇ °æ¿ì »ç¿ëÀÚ°¡ ³»¿ëÀ» ÀÔ·ÂÇßÀ¸¸ç ±× ³»¿ëÀÌ Á¤ÀÇµÈ ¹®ÀÚ ÁýÇÕ¿¡ ¸Â´ÂÁö È®ÀÎÇÏ·Á¸é RequiredFieldValidator¿Í RegularExpressionValidator°¡ ÇÊ¿äÇÕ´Ï´Ù.
ValidatorCollection¿¡´Â ID Ư¼ºÀÌ ÀÖÀ¸¸ç, ¸¸µé¾î¼ »ç¿ëÀÚ ÀÔ·Â Çʵ忡 Àû¿ëÇØ¾ß ÇÒ °¢ À¯È¿¼º °Ë»ç±âÀÇ Validator ÀÚ½Ä ³ëµå Ä÷º¼ÇÀÌ ÀÖ½À´Ï´Ù. ValidatorCollectionÀÇ ID Ư¼ºÀº Web Form¿¡ ÀÖ´Â PlaceHolderÀÇ ID ¼Ó¼º°ú ÀÏÄ¡ÇØ¾ß »ç¿ëÀÚ ÀÔ·Â Çʵ带 ¸¸µé¾î Àû¿ëÇÒ À¯È¿¼º °Ë»ç±âÀÇ Ä÷º¼Ç¿¡ ¿¬°áÇÒ ¼ö ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î ¾ÏÈ£ Çʵ忡 ´ëÇÑ ValidatorCollection¿¡´Â Validator ÀÚ½Ä ³ëµå°¡ µÎ °³ÀÎ "Password"ÀÇ ID°¡ ÀÖ½À´Ï´Ù. ÀÚ½Ä ³ëµå Áß Çϳª´Â Çʼö Çʵå¿ëÀ̰í Çϳª´Â Á¤±Ô½Ä¿ëÀÔ´Ï´Ù. Validator ÇÏÀ§ ³ëµå¿¡´Â Defaults ¼½¼Ç¿¡ Á¤ÀÇµÈ ¼Ó¼º °ªÀ» ÀçÁ¤ÀÇÇϰųª Defaults ¼½¼Ç¿¡ Á¤ÀǵǾî ÀÖÁö ¾ÊÀº ¼Ó¼º °ªÀÌ Æ÷ÇԵ˴ϴÙ.
»ç¿ëÀÚ ÀÔ·Â Çʵ尡 ¸¹±â ¶§¹®¿¡ ValidatorCollection ³ëµå ÁýÇÕÀÌ ÀÖ°í ÀÌ·¯ÇÑ ³ëµå´Â ±¸¼º ÆÄÀÏÀÇ ValidatorSets ³ëµå Çϳª¿¡ Æ÷ÇԵ˴ϴÙ.
´ÙÀ½Àº ÀüÀÚ ¸ÞÀÏ ÁÖ¼Ò ¹× ¾ÏÈ£ Çʵ忡 ´ëÇÑ ±¸¼º ÆÄÀÏ ºÎºÐÀÔ´Ï´Ù.
<!--
ÀÌ ¼½¼Ç¿¡¼´Â À¯È¿¼º °Ë»ç±â ±×·ìÀ» Á¤ÀÇÇÕ´Ï´Ù.
À¯È¿¼º °Ë»ç±â ±×·ìÀº À¯È¿¼º °Ë»ç±â Ä÷º¼Ç°ú ±× ¼Ó¼ºÀ» Á¤ÀÇÇÕ´Ï´Ù.
-->
<ValidatorSets>
<!--
EmailAddress¿¡ »ç¿ëÇÒ À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Ä÷º¼ÇÀÔ´Ï´Ù.
-->
<ValidatorCollection id="EmailAddress"
FriendlyName="Email address"
ControlToValidate="TextBoxEmailAddress">
<Validator type="RequiredField" />
</ValidatorCollection>
<!--
¾ÏÈ£¿¡ »ç¿ëÇÒ À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Ä÷º¼ÇÀÔ´Ï´Ù.
-->
<ValidatorCollection id="Password"
FriendlyName="Password"
LegalValues="¿µ¹®ÀÚ ¹× ¼ýÀÚ"
ControlToValidate="TextBoxPassword">
<Validator type="RequiredField" />
<Validator type="RegularExpression">
<Property name="ValidationExpression" value="[A-Za-z0-9]*" />
</Validator>
</ValidatorCollection>
</ValidatorSets>
ÀüÀÚ ¸ÞÀÏ ÁÖ¼Ò Ä÷º¼Ç¿¡´Â RequiredFieldValidator¸¦ µ¿ÀûÀ¸·Î ¸¸µé¾î TextBoxEmailAddress »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·Ñ¿¡ Àû¿ëÇØ¾ß ÇÔÀ» ³ªÅ¸³»´Â Validator ÀÚ½Ä ³ëµå ÇÑ °³°¡ ÀÖ½À´Ï´Ù. Validator ³ëµå¿¡´Â ÀÚ½Ä ³ëµå°¡ ¾øÀ¸¹Ç·Î Defaults ³ëµå¿¡ Á¤ÀÇµÈ ¼Ó¼º °ª¿¡¼ ¸ðµç ¼Ó¼º °ªÀÌ ÆÄ»ýµË´Ï´Ù. ÀÌ µ¿ÀÛ ¿ª½Ã ÀúÀý·Î ¹ß»ýÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó Äڵ忡¼ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù.
¾ÏÈ£ Ä÷º¼Ç¿¡´Â RequiredFieldValidator¿Í RegularExpressionValidator¸¦ µ¿ÀûÀ¸·Î ¸¸µé¾î TextBoxEmailPassword »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·Ñ¿¡ Àû¿ëÇØ¾ß ÇÔÀ» ³ªÅ¸³»´Â µÎ °³ÀÇ Validator ÀÚ½Ä ³ëµå°¡ ÀÖ½À´Ï´Ù. RegularExpressionValidatorÀÇ ValidationExpression ¼Ó¼ºÀº "[A-Za-z0-9]"·Î ¼³Á¤µÇ¾î¾ß ÇÕ´Ï´Ù. RequiredFieldValidator À¯È¿¼º °Ë»ç±âµµ Defaults ³ëµå¿¡ Á¤ÀÇµÈ ¼Ó¼º °ª¿¡¼ ÇØ´ç ¼Ó¼º °ªÀ» °¡Á®¿Í¾ß ÇÕ´Ï´Ù.
ÀÌÁ¦ Çʵå À̸§ °ªÀ» Á¤ÀÇÇϰڽÀ´Ï´Ù. ValidatorCollection ³ëµå¿¡ FriendlyNameÀ̶ó´Â Ư¼ºÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ÀÌ Æ¯¼ºÀÇ ³»ºÎ ÅØ½ºÆ®¸¦ »ç¿ëÇÏ¿© ±¸¼º ÆÄÀÏ¿¡ Æ÷ÇÔµÈ ¼Ó¼º °ª¿¡ ÀÖ´Â ¸ðµç {FriendlyName} ÀνºÅϽº¸¦ ´ëüÇϹǷΠ¿©·¯ ValidatorCollectionÀÌ °°Àº ±âº» Çʼö Çʵå À¯È¿¼º °Ë»ç±â Á¤ÀǸ¦ ÂüÁ¶ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ·¯ÇÑ ³ëµå´Â ÇØ´ç À̸§À» ½Äº°ÇÏ¿© ÃÖÁ¾ »ç¿ëÀÚ¿¡°Ô Ç¥½ÃµÇ´Â ¸Þ½ÃÁö¸¦ »ç¿ëÀÚ ÁöÁ¤Çϱ⸸ ÇÏ¸é µË´Ï´Ù.
µ¥ÀÌÅÍ ±¸Á¶
ÀÌ ±¸¼º Á¤º¸¸¦ ¸ðµÎ ÀúÀåÇÒ Æ¯Á¤ Çü½ÄÀÇ µ¥ÀÌÅÍ ±¸Á¶°¡ ÇÊ¿äÇÕ´Ï´Ù. ÀÛ¾÷À» ´Ü¼øÈÇϱâ À§ÇØ ¸¹Àº ½Ã°£À» ÅõÀÚÇÏ¿© ÀÌ µ¥ÀÌÅÍ ±¸Á¶¸¦ ºôµåÇÑ ´ÙÀ½ ASP.NET ÀÀ¿ë ÇÁ·Î±×·¥ ij½Ã¿¡ ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌ·¯ÇÑ Çü½ÄÀÇ ±¸Á¶´Â ÀÀ¿ë ÇÁ·Î±×·¥ ¾ÈÀÇ ¸ðµç ´ÜÀÏ ÆäÀÌÁö¿Í °ü·ÃÀÌ ÀÖÀ¸¹Ç·Î ÀÀ¿ë ÇÁ·Î±×·¥ ij½Ã¿¡ ÀúÀåÇϱ⿡ ÀûÇÕÇÕ´Ï´Ù. ±¸¼º ÆÄÀÏ¿¡¼ ij½Ã Á¾¼Ó¼ºÀ» ¼³Á¤ÇÏ¿© ÆÄÀÏÀ» ¼öÁ¤ÇÒ °æ¿ì ij½Ã Ç׸ñÀ» void·Î ¼³Á¤ÇÑ ÈÄ ´ÙÀ½ ¾×¼¼½º¿¡¼ ´Ù½Ã ¸¸µéµµ·Ï ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
ÀÀ¿ë ÇÁ·Î±×·¥ ij½Ã¿¡ ÀúÀåµÇ´Â µ¥ÀÌÅÍ ±¸Á¶´Â ´ÙÀ½°ú °°½À´Ï´Ù.

±×¸² 1. ÀÀ¿ë ÇÁ·Î±×·¥ ij½Ã¿¡ ÀúÀåµÇ´Â µ¥ÀÌÅÍ ±¸Á¶
Hashtable¿¡´Â µ¿ÀûÀ¸·Î À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ» ¸¸µé¾î Àû¿ëÇØ¾ß ÇÏ´Â °¢ »ç¿ëÀÚ ÀÔ·Â Çʵå Ç׸ñÀÌ Æ÷ÇԵ˴ϴÙ. À§ÀÇ ±×¸² 1¿¡ ³ª¿À´Â "email" ¹× "psword"¿Í °°Àº Ű´Â µ¿ÀûÀ¸·Î ¸¸µé¾î Ãß°¡ÇÒ À¯È¿¼º °Ë»ç±â ¸ñ·ÏÀ» È®ÀÎÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â PlaceHolderÀÇ ID ¼Ó¼º°ú ÀÏÄ¡ÇÕ´Ï´Ù.
±×·¯¹Ç·Î ÀüÀÚ ¸ÞÀÏ ÁÖ¼Ò µîÀÇ »ç¿ëÀÚ ÀÔ·Â Çʵ尡 ÀÖ´Â Web Form¿¡´Â "email"ÀÇ ID°¡ ÀÖ´Â PlaceHolder ÄÁÆ®·ÑÀÌ Æ÷ÇԵ˴ϴÙ. ÀÌ ÄÁÆ®·ÑÀ» »ç¿ëÇÏ¿© Hashtable·Î À妽ÌÇϰí, µ¿ÀûÀ¸·Î ¸¸µé¾î PlaceHolder¿¡ Ãß°¡ÇÒ À¯È¿¼º °Ë»ç±âÀÇ ArrayList¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ArrayList´Â ¹Ýº¹µÇ¸ç µ¿ÀûÀ¸·Î ¸¸µç À¯È¿¼º °Ë»ç±âÀÇ ¼Ó¼ºÀº ¿¬°áµÈ StringDictionary¿¡ ÀúÀåµË´Ï´Ù.
DynamicValidationManager Ŭ·¡½º
ÀÌ ÀýÂ÷¸¦ °ü¸®Çϱâ À§ÇØ µÎ °³ÀÇ public ¸Þ¼µå°¡ ÀÖ´Â °£´ÜÇÑ Å¬·¡½º¸¦ ¸¸µì´Ï´Ù. ¸Þ¼µå Áß Çϳª´Â ±¸¹®ÀÌ°í ´Ù¸¥ Çϳª´Â ÁöÁ¤µÈ Web FormÀ̳ª »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ¿¡ ´ëÇÑ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» µ¿ÀûÀ¸·Î ·ÎµåÇÒ ¸Þ¼µåÀÔ´Ï´Ù.
°ü¸®ÀÚ°¡ ¸ðµç Web Form¿¡ PlaceHolder¸¦ ¸¸µå´À¶ó ½Ã°£À» ÇãºñÇÏÁö ¾Êµµ·Ï ÀÌ ÄÁÆ®·ÑÀ» ÀÀ¿ë ÇÁ·Î±×·¥ ij½Ã¿¡ ÀúÀåÇÕ´Ï´Ù. ¾×¼¼½ºÇÒ ¶§¸¶´Ù ÄÁÆ®·ÑÀ» ¸¸µé¾î¾ß ÇÒÁö ¿©ºÎ¸¦ È®ÀÎÇÕ´Ï´Ù. ÄÁÆ®·ÑÀ» ¸¸µé¾î¾ß ÇÏ´Â °æ¿ì´Â óÀ½ ¾×¼¼½ºÇÏ´Â °æ¿ì¿Í Ç׸ñÀÌ Ç÷¯½ÃµÈ °æ¿ìÀÔ´Ï´Ù. °³Ã¼°¡ ¿¬°áµÈ ±¸¼º ÆÄÀÏ¿¡ Á¾¼ÓµÇ¹Ç·Î ÆÄÀÏÀ» ¼öÁ¤ÇÒ °æ¿ì ÀÀ¿ë ÇÁ·Î±×·¥ ij½Ã¿¡¼ ÀÚµ¿À¸·Î °ü¸®ÀÚ°¡ Ç÷¯½ÃµÇµµ·Ï ij½Ã Á¾¼Ó¼ºÀ» ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
µ¿Àû À¯È¿¼º °Ë»ç °ü¸®ÀÚ »ý¼ºÀÚ
»ý¼ºÀÚ´Â À§ÀÇ ±×¸² 1¿¡¼¿Í °°Àº µ¥ÀÌÅÍ ±¸Á¶¸¦ ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ±×·¯·Á¸é ´ÙÀ½ ´Ü°è¸¦ ¼öÇàÇØ¾ß ÇÕ´Ï´Ù.
- °ü¸®ÀÚÀÇ °³ÀÎ ¼Ó¼º°ú »ý¼ºÀÚ ¼¸íÀ» Á¤ÀÇÇÕ´Ï´Ù.
- ±¸¼º ÆÄÀÏÀ» XML ¹®¼·Î ·ÎµåÇÕ´Ï´Ù.
- °ø¿ë ¹× ±âº» ¼Ó¼º °ªÀ» ·ÎµåÇÕ´Ï´Ù.
- °¢ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ¹Ýº¹ÇÕ´Ï´Ù.
°³º° À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ·ÎµåÇÕ´Ï´Ù.
À¯È¿¼º °Ë»ç±â¿¡ ´ëÇØ Á¤ÀÇµÈ °¢ ¼Ó¼ºÀ» ¹Ýº¹ÇÕ´Ï´Ù.
°ø¿ë/±âº» ¼Ó¼º °ªÀÌ Á¤ÀǵǾî ÀÖÀ¸¸é ¹®ÀÚ¿ »çÀü¿¡ »ðÀÔÇÕ´Ï´Ù.
¹®ÀÚ¿ »çÀü¿¡¼ ƯÁ¤ ¼Ó¼º °ªÀ» µ¤¾î¾²°Å³ª »ðÀÔÇÕ´Ï´Ù.
À¯È¿¼º °Ë»ç±âÀÇ ¹è¿ ¸ñ·Ï¿¡ ¹®ÀÚ¿ »çÀüÀ» Ãß°¡ÇÕ´Ï´Ù.
À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀÇ ÇØ½Ã Å×ÀÌºí¿¡ ¹è¿ ¸ñ·ÏÀ» Ãß°¡ÇÕ´Ï´Ù.
- ÀÌ·¯ÇÑ ´Ü°è¸¦ ±¸ÇöÇÒ ÄÚµå´Â ¾Æ·¡¿¡ ³ª¿Í ÀÖ½À´Ï´Ù.
°³ÀÎ ¼Ó¼º ¹× »ý¼ºÀÚ ¼¸í Á¤ÀÇ
µ¿Àû À¯È¿¼º °Ë»ç °ü¸®ÀÚ¿¡ ´ëÇØ µÎ °³ÀÇ °³ÀÎ ¼Ó¼ºÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù. Çϳª´Â ó¸®ÇÒ À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Á¾·ù ¸ñ·ÏÀÌ°í ´Ù¸¥ Çϳª´Â À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀÇ ÇØ½Ã Å×À̺íÀÔ´Ï´Ù. »ý¼ºÀÚ ¼¸í¿¡´Â ±¸¼º ÆÄÀÏ °æ·Î¸¦ Á¤ÀÇÇÏ´Â ¸Å°³ º¯¼ö°¡ Æ÷ÇԵ˴ϴÙ. ¾Æ·¡¸¦ º¸¸é ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
// ´ÙÀ½Àº Á¦°øÇÒ À¯È¿¼º °Ë»ç±â Çü½ÄÀÔ´Ï´Ù.
private enum ValidatorTypes {Common, Compare,
Custom, Range, RegularExpression, RequiredField,
ValidationSummary};
// ±¸¼º ÆÄÀÏÀÇ <ValidatorCollections> ³ëµå¿¡ Á¤ÀǵÈ
// À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Ä÷º¼ÇÀ» º¸°üÇÕ´Ï´Ù.
// ÀÌ Ç׸ñÀº Á¤ÀÇµÈ °¢ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ
// ¼Ó¼º/°ªÀÇ ¹®ÀÚ¿ »çÀü ¹è¿ ¸ñ·ÏÀ» º¸°üÇÕ´Ï´Ù.
private Hashtable validatorCollections = new Hashtable();
/// <summary>
/// µ¿Àû À¯È¿¼º °Ë»ç °³Ã¼¸¦ ºôµåÇÕ´Ï´Ù.
/// </summary>
/// <param name="validatorsConfigFile">µ¿Àû À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ¿¡ ´ëÇÑ
/// ±¸¼º ÆÄÀÏ</param>
public DynamicValidationManager( string validatorsConfigFile )
{
ValidatorTypes ¿°ÅÇüÀ» »ç¿ëÇÏ¸é ½±°Ô ¹®ÀÚ¿ °ª ¸ñ·ÏÀ» ó¸®Çϰųª Á¤¼ö À妽º¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ ¿°ÅÇüÀ» »ç¿ëÇÕ´Ï´Ù. Enum Ŭ·¡½ºÀÇ GetNames() Á¤Àû ¸Þ¼µå¸¦ »ç¿ëÇÏ¸é ¹®ÀÚ¿ °ª ¸ñ·ÏÀ» °¡Á®¿Ã ¼ö ÀÖÀ¸¸ç, ¿°ÅÇüÀÇ ÀνºÅϽº¸¦ Á¤¼ö·Î ij½ºÆÃÇϱ⸸ Çϸé ÇØ´ç À妽º¸¦ °¡Á®¿Ã ¼ö ÀÖ½À´Ï´Ù.
XML ¹®¼·Î ±¸¼º ÆÄÀÏ ·Îµå
±¸¼º ÆÄÀÏÀ» ·ÎµåÇϱâ À§ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ¸Å¿ì °£´ÜÇÕ´Ï´Ù.
// ±¸¼º ÆÄÀÏÀ» XML ¹®¼·Î ·ÎµåÇÕ´Ï´Ù.
XmlTextReader xmlTextReader = new XmlTextReader( validatorsConfigFile );
XmlDocument configurationDocument = new XmlDocument();
configurationDocument.Load( xmlTextReader );
XML µ¥ÀÌÅÍ¿¡ ´ëÇØ ºü¸£°í ij½ÃµÇÁö ¾ÊÀº ÀüÁø Àü¿ë ¾×¼¼½º¸¸ °¡´ÉÇϵµ·Ï XmlTextReader¸¦ »ç¿ëÇÕ´Ï´Ù. ÃÖ´ëÇÑ »¡¸® ÀÌ ±¸¼º ÆÄÀÏÀ» ó¸®ÇÒ °ÍÀÌ¸ç µ¥ÀÌÅÍ ±¸Á¶¿¡ °ªÀÌ ÀúÀåµÇ¹Ç·Î ÀÌ ÆÄÀÏÀ» ij½ÃÇÒ Çʿ䰡 ¾ø½À´Ï´Ù.
°ø¿ë ¹× ±âº» ¼Ó¼º °ª ·Îµå
StringDictionariesÀÇ Àӽà ¹è¿À» »ç¿ëÇÏ¿© °ø¿ë °ª ¹× ±âº»°ªÀ» ÀúÀåÇÕ´Ï´Ù. ±¸¼º ÆÄÀÏÀÇ Defaults ³ëµå¿¡ Á¤ÀÇµÈ ´ë·Î °¢ StringDictionary¿¡´Â ¸ðµç °ø¿ë ¹× ±âº» ¼Ó¼º °ªÀÌ ÀúÀåµË´Ï´Ù. ±×·¯¸é ValidatorCollections ³ëµå¿¡ Á¤ÀÇµÈ Æ¯Á¤ À¯È¿¼º °Ë»ç±â °ªÀ» ¼³Á¤ÇÒ ¶§ ¿Ã¹Ù¸¥ "±âº»°ª" ÇØ½Ã Å×ÀÌºí¿¡ ½Å¼ÓÇÏ°Ô ¾×¼¼½ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
±âº» ¼Ó¼º °ªÀ» ·ÎµåÇϱâ À§ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.
// ±¸¼º ÆÄÀÏÀÇ <Defaults> ³ëµå¿¡ Á¤ÀǵÈ
// ±âº» ¼Ó¼ºÀ» º¸°üÇÕ´Ï´Ù.
// ¹è¿¿¡´Â ±âº» ¼Ó¼ºÀÇ StringDictionary Çϳª¿Í
// °¢ À¯È¿¼º °Ë»ç±â Çü½Ä¿¡ ´ëÇÑ ±âº» ¼Ó¼º ¹× °ªÀÌ º¸°üµË´Ï´Ù.
StringDictionary[] defaultProperties =
new StringDictionary[Enum.GetNames(typeof(ValidatorTypes)).Length];
// °¢ ValidatorTypeÀ» ¹Ýº¹ÇÕ´Ï´Ù.
int iCnt = 0;
foreach ( string validatorType in Enum.GetNames( typeof(ValidatorTypes) ) )
{
// ÇöÀç À¯È¿¼º °Ë»ç±â Çü½Ä¿¡ ´ëÇÑ
// ¼Ó¼º/°ª ½ÖÀ» º¸°üÇÒ »õ ÇØ½Ã Å×À̺íÀ» ¸¸µì´Ï´Ù.
defaultProperties[iCnt] = new StringDictionary();
// ±¸¼º ¹®¼¿¡¼ ±âº» ¼³Á¤À» ·ÎµåÇÕ´Ï´Ù.
LoadDefaultProperties( configurationDocument,
validatorType, defaultProperties[iCnt] );
// Ä«¿îÅͰ¡ Áõ°¡ÇÕ´Ï´Ù.
iCnt++;
}
StringDictionariesÀÇ defaultProperties ¹è¿À» Á¤ÀÇÇϰí Enum Ŭ·¡½ºÀÇ Á¤Àû ¸Þ¼µå GetNames()°¡ ¹ÝȯÇÑ ¹è¿ ±æÀ̸¦ »ç¿ëÇÏ¿© Á¤È®ÇÑ Ç׸ñ ¼ö¸¦ °¡Á®¿É´Ï´Ù.
±×·± ´ÙÀ½ ValidatorTypes ¿°ÅÇü¿¡ ÀÖ´Â À̸§ ¹è¿ÀÇ °¢ Ç׸ñÀ» ¹Ýº¹Çϰí LoadDefaultProperties ¸Þ¼µå¸¦ È£ÃâÇÏ¿© ±âº» ¼Ó¼º¿¡ ·ÎµåÇÕ´Ï´Ù.
LoadDefaultProperties ¸Þ¼µå¿¡ ´ëÇÑ ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.
/// <summary>
/// ±¸¼º ¹®¼ÀÇ ±âº» ¼³Á¤À» ¼Ó¼º ÀúÀå¼Ò·Î ·ÎµåÇÕ´Ï´Ù.
/// </summary>
/// <param name="configurationDocument">±¸¼º Á¤º¸¸¦ º¸°üÇÏ´Â
/// XML ¹®¼</param>
/// <param name="validatorType">·ÎµåÇÒ À¯È¿¼º °Ë»ç±â Çü½Ä</param>
/// <param name="propertyStore">°Ë»öµÈ ±âº» ¼Ó¼º ¹× °ªÀ»
/// º¸°üÇÒ ÀúÀå¼Ò</param>
private void LoadDefaultProperties( XmlDocument configurationDocument,
string validatorType, StringDictionary defaultPropertiesStore )
{
// ÁöÁ¤ÇÑ À¯È¿¼º °Ë»ç±âÀÇ ±âº» ¼Ó¼ºÀ» º¸°üÇÏ´Â
// ³ëµå¸¦ ¼±ÅÃÇÕ´Ï´Ù.
XmlNode defaultValidatorNode =
configurationDocument.SelectSingleNode( "//Defaults/" +
validatorType );
// ±âº» À¯È¿¼º °Ë»ç±â ¼Ó¼ºÀÌ µé¾î ÀÖ´Â ³ëµå°¡ ÀÖÀ» °æ¿ì ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÕ´Ï´Ù.
if ( defaultValidatorNode != null )
{
// °¢ À¯È¿¼º °Ë»ç±â ¼Ó¼º¿¡ ´ëÇØ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÕ´Ï´Ù.
foreach( XmlNode defaultValidatorProperty in
defaultValidatorNode.ChildNodes )
{
// XML ¿ä¼Ò¸¸ ó¸®Çϰí ÁÖ¼® µîÀº ¹«½ÃÇÕ´Ï´Ù.
if ( defaultValidatorProperty is XmlElement )
{
// ±âº» ¼Ó¼º ÀúÀå¼ÒÀÇ ÀúÀå¼Ò¿¡
// ¼Ó¼º À̸§°ú ±âº»°ªÀ»
// »ðÀÔÇÕ´Ï´Ù.
string propertyName = GetAttribute( defaultValidatorProperty,
"name" );
string propertyValue = GetAttribute( defaultValidatorProperty,
"value" );
defaultPropertiesStore[ propertyName ] = propertyValue;
}
}
}
}
ÀÌ ÄÚµå ¿ª½Ã ¸Å¿ì °£´ÜÇÕ´Ï´Ù. ¸Þ¼µå¿¡´Â XML ±¸¼º ¹®¼, ó¸®ÇÒ À¯È¿¼º °Ë»ç±â Çü½Ä, °ªÀ» ·ÎµåÇÒ StringDictionary°¡ Á¦°øµË´Ï´Ù.
SelectSingleNode ¸Þ¼µå¸¦ »ç¿ëÇÏ¿© ¿Ã¹Ù¸¥ Çü½ÄÀÇ XPath ½ÄÀ» Àü´ÞÇÏ¿© ±¸¼º ¹®¼¿¡ ±âº» À¯È¿¼º °Ë»ç±â ³ëµå¸¦ Æ÷ÇÔÇÕ´Ï´Ù. ±âº» À¯È¿¼º °Ë»ç±â ³ëµå°¡ ¹ÝȯµÇ¸é ´ÙÀ½°ú °°Àº Çü½ÄÀÇ °á°ú°¡ ¹ß»ýÇÕ´Ï´Ù.
<RequiredField>
<Property name="InitialValue" value="" />
<Property name="Text" value="ÀÌ Çʵå´Â Çʼö ÇʵåÀÔ´Ï´Ù." />
<Property name="ErrorMessage"
value="{FriendlyName}¿¡ ´ëÇÑ ³»¿ëÀ» ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù." />
</RequiredField>
À§¿¡ ³ª¿Í ÀÖ´Â ±âº» RequiredField ³ëµå »ùÇÿ¡¼´Â ½ÇÁ¦ ¼Ó¼º À̸§°ú °ªÀÌ µé¾î ÀÖ´Â ¿©·¯ ÀÚ½Ä ³ëµå°¡ ÀÖÀ¸¸ç ÀÌ·¯ÇÑ ³ëµå´Â ¼Ó¼º °ªÀ» ³ªÅ¸³½´Ù´Â °ÍÀ» º¸¿© ÁÝ´Ï´Ù.
defaultValidatorNodeÀÇ ChildNodes ¼Ó¼º¿¡ ¾×¼¼½ºÇÏ¿© ÀÚ½Ä ³ëµå Ä÷º¼ÇÀ¸·Î À̵¿ÇÕ´Ï´Ù. °¢ ÀÚ½Ä ³ëµå¿¡ ´ëÇØ GetAttribute ¸Þ¼µå¸¦ »ç¿ëÇÏ¿© À̸§/°ª Ư¼ºÀ» ÃßÃâÇϰí ÀÌ·¯ÇÑ Æ¯¼ºÀ» Ű/°ª ½ÖÀ¸·Î StringDictionary¿¡ »ðÀÔÇÕ´Ï´Ù.
¿©±â¼´Â ¼Ó¼º °ª¿¡ ¸Å°³ º¯¼ö¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖÀ¸¸ç ErrorMessage ¼Ó¼º¿¡¼ ÀÌ »ç½ÇÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù. FriendlyName ¸Å°³ º¯¼öÀÇ ½ÇÁ¦ °ªÀº ±¸¼º ¹®¼ÀÇ ValidatorSets ³ëµå¿¡ Á¤ÀÇµÈ Æ¯Á¤ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇØ Á¤Àǵ˴ϴÙ.
°¢ À¯È¿¼º °Ë»ç±â Ä÷º¼Ç ¹Ýº¹
±¸¼º ¹®¼¿¡ ÁöÁ¤µÈ °ø¿ë ¹× ±âº»°ªÀ» ¸ðµÎ ·ÎµåÇßÀ¸¹Ç·Î ValidatorSets ³ëµå¿¡ ÀÖ´Â À¯È¿¼º °Ë»ç±â Ä÷º¼Ç ÁýÇÕÀ» ·ÎµåÇÒ ¼ö ÀÖ½À´Ï´Ù.
Äڵ带 ½±°Ô ÀÐÀ» ¼ö ÀÖµµ·Ï »ý¼ºÀÚ°¡ LoadAllValidatorCollections ¸Þ¼µå¸¦ È£ÃâÇÏ¿© XML ±¸¼º ¹®¼ ¹× ±âº»°ªÀÌ µé¾î ÀÖ´Â ÇØ½Ã Å×ÀÌºí ¹è¿¿¡ Àü´ÞÇÕ´Ï´Ù.
LoadAllValidatorCollections ¸Þ¼µå´Â ´ÙÀ½°ú °°½À´Ï´Ù.
/// <summary>
/// À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ¸ðµÎ ·ÎµåÇÕ´Ï´Ù.
/// </summary>
/// <param name="configurationDocument">±¸¼º Á¤º¸¸¦ º¸°üÇÏ´Â
/// XML ¹®¼</param>
private void LoadAllValidatorCollections( XmlDocument
configurationDocument, StringDictionary[] defaultProperties )
{
// ÁöÁ¤ÇÑ »ç¿ëÀÚ ÀÔ·Â ÇʵåÀÇ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ¸ðµÎ º¸°üÇÏ´Â
// ³ëµå¸¦ ¼±ÅÃÇÕ´Ï´Ù.
XmlNode allValidatorCollections =
configurationDocument.SelectSingleNode( "//ValidatorSets" );
// À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀÌ µé¾î ÀÖ´Â ³ëµå¸¦ °¡Á®¿Â °æ¿ì ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÕ´Ï´Ù.
if ( allValidatorCollections != null )
{
// À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ¹Ýº¹ÇÕ´Ï´Ù.
foreach ( XmlNode validatorCollection in
allValidatorCollections.ChildNodes )
{
// »ç¿ëÀÚ ÀÔ·Â Çʵ忡 ´ëÇÑ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ·ÎµåÇÕ´Ï´Ù.
if ( validatorCollection is XmlElement )
{
LoadIndividualValidatorCollection( validatorCollection,
defaultProperties );
}
}
}
}
ÀÏ·ÃÀÇ ÀÚ½Ä ³ëµå¸¦ ó¸®ÇÑ´Ù´Â Á¡¿¡¼ ÀÌ ¸Þ¼µå´Â LoadDefaultProperties ¸Þ¼µå¿Í ¸Å¿ì ºñ½ÁÇÕ´Ï´Ù. LoadIndividualValidatorCollection ¸Þ¼µå´Â XML ±¸¼º ¹®¼¿¡¼ °³º° À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ·ÎµåÇϱâ À§ÇØ È£ÃâµË´Ï´Ù.
°³º° À¯È¿¼º °Ë»ç±â Ä÷º¼Ç ·Îµå
´ÙÀ½Àº ¾ÏÈ£ ÇʵåÀÇ »ùÇà ±¸¼º ¹®¼ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀÔ´Ï´Ù.
<ValidatorCollection id="Password" FriendlyName="Password"
LegalValues="¿µ¹®ÀÚ ¹× ¼ýÀÚ"
ControlToValidate="TextBoxPassword">
<Validator type="RequiredField" />
<Validator type="RegularExpression">
<Property name="ValidationExpression" value="[A-Za-z0-9]*" />
</Validator>
</ValidatorCollection>
ÀÌ XML ³ëµå¸¦ Á¦´ë·Î ó¸®Çϱâ À§Çؼ´Â ÀÌ ³ëµå¿¡ ´ëÇØ µÎ °¡Áö »çÇ×À» ÀÌÇØÇØ¾ß ÇÕ´Ï´Ù. ù°, id Ư¼ºÀº Web Form¿¡ ÀÖ´Â PlaceHolder ÄÁÆ®·ÑÀÇ ID ¼Ó¼º°ú ÀÏÄ¡ÇÕ´Ï´Ù. ÀÌ Æ¯¼ºÀ» ÅëÇØ µ¿ÀûÀ¸·Î ¸¸µç À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» Ãß°¡ÇÒ À§Ä¡¸¦ ¾Ë ¼ö ÀÖÀ¸¹Ç·Î ÇØ´ç ÄÁÆ®·ÑÀ» ¿Ã¹Ù¸£°Ô ·»´õ¸µÇÏ¿© Web Form¿¡ Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.
µÑ°, ControlToValidate Ư¼ºÀº µ¿ÀûÀ¸·Î ¸¸µé¾î Ä÷º¼Ç¿¡ Æ÷ÇÔÇÑ ¸ðµç À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ» Àû¿ëÇÒ Æ¯Á¤ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·ÑÀÇ ID ¼Ó¼º°ú ÀÏÄ¡ÇÕ´Ï´Ù. ³¡À¸·Î, ValidatorCollection ³ëµå´Â ¸Å°³ º¯¼ö¸¦ Ư¼ºÀ¸·Î Á¤ÀÇÇϸç ÀÌ ³»¿ëÀº À§ÀÇ FriendlyName ¹× LegalValues ¸Å°³ º¯¼ö¿¡¼ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
LoadIndividualValidatorCollection ¸Þ¼µå´Â ¸ÕÀú °³º° Validator ÀÚ½Ä ³ëµå¿¡¼ µ¥ÀÌÅ͸¦ º¸°üÇÏ´Â µ¥ »ç¿ëÇÒ ArrayList¸¦ ¸¸µì´Ï´Ù. ±×·± ´ÙÀ½ °¢ À¯È¿¼º °Ë»ç±â ÀÚ½Ä ³ëµå¿¡ ´ëÇØ ½ÇÁ¦ ¼Ó¼º À̸§°ú °ªÀ» º¸°üÇÒ StringDictionary¸¦ ¸¸µì´Ï´Ù. ½Äº°ÀÚ, À¯È¿¼ºÀ» °Ë»çÇÒ ÄÁÆ®·Ñ µîÀÇ Á¤º¸¸¦ ±â¾ïÇϱâ À§ÇØ ÀÚ½Ä ³ëµåÀÇ Æ¯¼º¿¡ ¾×¼¼½ºÇÕ´Ï´Ù. ¾Æ·¡¸¦ º¸¸é ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
/// <summary>
/// ÁöÁ¤ÇÑ »ç¿ëÀÚ ÀÔ·Â Çʵ忡 Àû¿ëÇÒ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ·ÎµåÇÕ´Ï´Ù.
/// </summary>
/// <param name="validatorCollection">À¯È¿¼º °Ë»ç±â Ä÷º¼Ç</param>
/// <param name="defaultProperties">±âº» ¼Ó¼º °ª</param>
private void LoadIndividualValidatorCollection( XmlNode
validatorCollection, StringDictionary[] defaultProperties )
{
// ÁöÁ¤ÇÑ Çʵ忡 Àû¿ëÇÒ À¯È¿¼º °Ë»ç±â ¸ñ·ÏÀÔ´Ï´Ù.
ArrayList validatorList = new ArrayList();
// À¯È¿¼ºÀ» °Ë»çÇÒ ÄÁÆ®·ÑÀ» ±â¾ïÇÕ´Ï´Ù.
string controlToValidate = GetAttribute( validatorCollection,
"ControlToValidate" );
// Ä÷º¼ÇÀÇ °¢ À¯È¿¼º °Ë»ç±â¸¦ ¹Ýº¹ÇÕ´Ï´Ù.
foreach( XmlNode validatorNode in validatorCollection.ChildNodes )
{
// XML ¿ä¼Ò¸¸ ó¸®Çϰí ÁÖ¼® µîÀº ¹«½ÃÇÕ´Ï´Ù.
if ( validatorNode is XmlElement )
{
// »õ·Î¿î ¹®ÀÚ¿ »çÀüÀ» »ç¿ëÇÏ¿©
// À¯È¿¼º °Ë»ç±âÀÇ ¼Ó¼º°ú °ªÀ» º¸°üÇÕ´Ï´Ù.
StringDictionary validatorProperties = new StringDictionary();
// ÀÌ À¯È¿¼º °Ë»ç±â·Î °Ë»çÇÒ ÄÁÆ®·ÑÀ» ±â¾ïÇÕ´Ï´Ù.
validatorProperties[ "ControlToValidate" ] = controlToValidate;
// À¯È¿¼º °Ë»ç±â Çü½ÄÀ» ±â¾ïÇÕ´Ï´Ù.
string typeofValidator = GetAttribute( validatorNode, "type" );
validatorProperties["ValidatorType"] = typeofValidator;
// ServerValidate À̺¥Æ® 󸮱⸦ Ãß°¡ÇÕ´Ï´Ù(Custom À¯È¿¼º °Ë»ç±â¿¡¸¸ »ç¿ë).
validatorProperties[ "ServerValidate" ] =
GetAttribute( validatorNode, "ServerValidate" );
¿©±â¼ °³º° À¯È¿¼º °Ë»ç±âÀÇ Æ¯Á¤ÇÑ ¼Ó¼º °ªÀ» Á¤ÀÇÇÏ´Â µ¥ »ç¿ëÇÑ ¸î °¡Áö ÄÁÆ®·Ñ Á¤º¸¸¦ ±â·ÏÇß½À´Ï´Ù. ¿¹¸¦ µé¾î À¯È¿¼ºÀ» °Ë»çÇÒ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·Ñ, ¸¸µé·Á´Â À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Çü½Ä, ServerValidate À̺¥Æ®¸¦ È£ÃâÇÒ ¸Þ¼µå À̸§(ÀÖÀ» °æ¿ì) µîÀ» ±â·ÏÇß½À´Ï´Ù. ÀÌÁ¦ ÀÌ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ¼Ó¼º À̸§°ú °ªÀ» validatorProperties StringDictionary·Î ·ÎµåÇϰڽÀ´Ï´Ù.
¸ÕÀú °ø¿ë ¼Ó¼º °ª, ±âº» ¼Ó¼º °ª ¼ø¼·Î validatorProperties StringDictionary¿¡ ·ÎµåÇÑ ´ÙÀ½ ±¸¼º ¹®¼¿¡¼ ƯÁ¤ °ªÀ» ·ÎµåÇÕ´Ï´Ù. AssignDefaultValues ¸Þ¼µå¸¦ È£ÃâÇÏ¿© °ø¿ë ¹× ±âº»°ª ÇÒ´çÀ» ó¸®ÇÕ´Ï´Ù. private ¸Þ¼µå¿¡´Â ÀÌ À¯È¿¼º °Ë»ç±âÀÇ ¼Ó¼º À̸§°ú °ªÀÌ Æ÷ÇԵǴ StringDictionary ¸Å°³ º¯¼ö¿Í °ø¿ë ¶Ç´Â ±âº» ¼Ó¼º°ú °ªÀÌ Æ÷ÇԵǴ StringDictionary ¸Å°³ º¯¼ö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
±×·¯¸é ±âº» ¼Ó¼º °ªÀÌ °ø¿ë °ªÀ» µ¤¾î½á¼ °ø¿ë °ªº¸´Ù ¿ì¼±ÇÕ´Ï´Ù. ¾Æ·¡¸¦ º¸¸é ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
// ¸ðµç À¯È¿¼º °Ë»ç±â¿¡ °øÅëÀ¸·Î ±âº» ¼Ó¼º °ªÀ» ÇÒ´çÇÕ´Ï´Ù.
AssignDefaultValues( validatorProperties,
defaultProperties[(int) ValidatorTypes.Common] );
// ÀÌ·¯ÇÑ Çü½ÄÀÇ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ±âº» ¼Ó¼º °ªÀ» ÇÒ´çÇÕ´Ï´Ù.
ValidatorTypes validatorType = (ValidatorTypes) Enum.Parse(
typeof(ValidatorTypes), typeofValidator );
AssignDefaultValues( validatorProperties,
defaultProperties[(int) validatorType] );
°£´ÜÇÑ ¿ä·ÉÀ» ÀÌ¿ëÇØ defaultProperties ¹è¿¿¡ µé¾î ÀÖ´Â StringDictionary Áß ¾î´À °ÍÀ» »ç¿ëÇÒÁö °áÁ¤Çß½À´Ï´Ù. ÀÌÀüÀÇ ValidatorTypes ¿°ÅÇü ¼±¾ðÀ» ±â¾ïÇØ º¸½Ê½Ã¿À.
// ´ÙÀ½Àº °ü¸®ÇÒ À¯È¿¼º °Ë»ç±â Çü½ÄÀÔ´Ï´Ù.
private enum ValidatorTypes {Common, Compare,
Custom, Range, RegularExpression, RequiredField,
ValidationSummary};
typeOfValidator º¯¼ö´Â validatorNodeÀÇ "type" Ư¼º¿¡¼ °¡Á®¿Â ¹®ÀÚ¿ÀÌ¸ç °ªÀº "Compare", "Custom" µîÀÔ´Ï´Ù. ÀÌ º¯¼ö´Â ¿°ÅµÈ »ó¼ö Áß ÇϳªÀÇ À̸§À» ³ªÅ¸³»´Â ¹®ÀÚ¿À̹ǷΠEnum Ŭ·¡½ºÀÇ Á¤Àû Parse ¸Þ¼µå¸¦ »ç¿ëÇÏ¿© ¿°ÅµÈ ÇØ´ç °³Ã¼¸¦ °¡Á®¿Ã ¼ö ÀÖ½À´Ï´Ù.
±âº» ¿°ÅÇüÀ» ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î ±âº» Int32 Çü½ÄÀÌ »ç¿ëµË´Ï´Ù. µû¶ó¼ validatorType ¿°ÅÇüÀ» Int32¿¡ ij½ºÆÃÇÏ¸é ¿°ÅÇü¿¡¼ Á¤¼ö °ªÀÌ Á¦°øµË´Ï´Ù. ±×·± ´ÙÀ½ StringDictionaryÀÇ defaultProperties ¹è¿·Î À妽ÌÇÏ¿© ¿Ã¹Ù¸¥ À¯È¿¼º °Ë»ç±â Çü½ÄÀÇ ±âº»°ªÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
ÀÌ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇØ Ưº°È÷ Á¤ÀÇµÈ ¼Ó¼º°ú °ª¿¡ ¾×¼¼½ºÇÏ·Á¸é À¯È¿¼º °Ë»ç±âÀÇ °¢ ÀÚ½Ä ³ëµå¸¦ ¹Ýº¹ÇØ¾ß ÇÕ´Ï´Ù. ±×·¯¸é Çʵå À̸§ ¸Å°³ º¯¼ö¸¦ ValidatorCollection ³ëµåÀÇ ¸í¸íµÈ ÇØ´ç Ư¼º¿¡¼ ÆÄ»ýµÈ °ªÀ¸·Î ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. ¸¶Áö¸·À¸·Î ƯÁ¤ ¼Ó¼º À̸§°ú °ªÀÇ StringDictionary¸¦ ArrayList¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¾Æ·¡¸¦ º¸¸é ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
// °¢ ¼Ó¼º ³ëµå¸¦ ¹Ýº¹ÇÕ´Ï´Ù.
foreach ( XmlNode propertyNode in validatorNode.ChildNodes )
{
// XML ¿ä¼Ò¸¸ ó¸®Çϰí ÁÖ¼® µîÀº ¹«½ÃÇÕ´Ï´Ù.
if ( propertyNode is XmlElement )
{
// ÀÌ À¯È¿¼º °Ë»ç±â¿¡ ´ëÇØ ¸í½ÃÀûÀ¸·Î ÁöÁ¤µÈ ¼Ó¼º À̸§/°ªÀ» Ãß°¡ÇÕ´Ï´Ù.
string propertyName = GetAttribute( propertyNode, "name" );
string propertyValue = GetAttribute( propertyNode, "value" );
validatorProperties[ propertyName ] = propertyValue;
}
}
// ÀÌÁ¦ ¹®ÀÚ¿ »çÀüÀÌ ¸¸µé¾îÁ³À¸¹Ç·Î
// ÁöÁ¤µÈ Çʵå À̸§ ´ëü Ç׸ñÀ» ¸¸µì´Ï´Ù.
ReplaceFieldnamesWithValues( validatorProperties, validatorCollection );
// ¸¶Áö¸·À¸·Î À¯È¿¼º °Ë»ç±â ¼Ó¼º °ªÀ» Æ÷ÇÔÇÏ´Â
// ¹®ÀÚ¿ »çÀüÀ» ÀÌ ±×·ìÀÇ À¯È¿¼º °Ë»ç±â ¸ñ·Ï¿¡
// Ãß°¡ÇÕ´Ï´Ù.
validatorList.Add( validatorProperties );
Çʵå À̸§À» ¾Ë¸ÂÀº °ªÀ¸·Î ´ëüÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼´Â ÀÚ¼¼È÷ ´Ù·çÁö ¾Ê°Ú½À´Ï´Ù. °£´ÜÈ÷ ¸»ÇØ ¹®ÀÚ¿ »çÀü¿¡ µé¾î ÀÖ´Â ¼Ó¼º °ªÀ» ¹Ýº¹ÇÏ¿© ¿©´Â Áß°ýÈ£¸¦ ã¾Æ¾ß ÇÕ´Ï´Ù. ¿©´Â Áß°ýÈ£¸¦ ãÀ¸¸é ´Ý´Â Áß°ýÈ£±îÁöÀÇ ¹®ÀÚ¿À» °¡Á®¿Í¾ß Çϸç, ÀÌ ³»¿ëÀÌ ¸Å°³ º¯¼ö À̸§ÀÌ µË´Ï´Ù. ±×·± ´ÙÀ½ À¯È¿¼º °Ë»ç±â Ä÷º¼Ç ³ëµå¿¡¼ ÀÌ À̸§ÀÇ Æ¯¼ºÀ» ã°í ÇØ´ç InnerText ¼Ó¼ºÀ» ¸Å°³ º¯¼ö °ªÀ¸·Î »ç¿ëÇÕ´Ï´Ù. ¹®ÀÚ¿ ´ëü Ç׸ñÀ» »ç¿ëÇÏ¸é ¸Å°³ º¯¼ö À̸§ÀÌ °£´ÜÈ÷ ¸Å°³ º¯¼ö °ªÀ¸·Î ´ëüµË´Ï´Ù.
µ¿ÀûÀ¸·Î À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ ·Îµå
À§ÀÇ ±×¸² 1¿¡ Á¤ÀÇµÈ ´ë·Î ±¸¼º ÆÄÀÏÀ» ·±Å¸ÀÓ µ¥ÀÌÅÍ ±¸Á¶¿¡ ·ÎµåÇßÀ¸¹Ç·Î ÀÌÁ¦ À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ» µ¿ÀûÀ¸·Î ¸¸µé¾î PlaceHolder¿¡ Ãß°¡ÇÏ´Â Àç¹ÌÀÖ´Â ºÎºÐ¿¡ ÁýÁßÇÏ¿© »ìÆìº¸°Ú½À´Ï´Ù.
LoadDynamicValidators ¸Þ¼µå´Â ÀÚ¸® Ç¥½ÃÀÚ¸¦ È£½ºÆ®ÇÏ´Â UserControlÀ̶ó´Â ´ÜÀÏ ÀÔ·Â ¸Å°³ º¯¼ö¸¦ »ç¿ëÇÕ´Ï´Ù. ±âº» °³³äÀº ÀÌ ¸Þ¼µå°¡ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ¿¡¼ È£½ºÆ®ÇÏ´Â ÄÁÆ®·Ñ ¸ðÀ½À» ¹Ýº¹ÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù. PlaceHolder ÄÁÆ®·ÑÀ» ãÀ¸¸é validatorCollections ÇØ½Ã Å×À̺í·Î À妽ÌÇÏ¿© ÀÌ PlaceHolder¿¡ ´ëÇØ µ¿ÀûÀ¸·Î »ý¼ºÇÒ À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ ÁýÇÕÀÌ ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù. ÄÁÆ®·Ñ ÁýÇÕÀÌ ÀÖÀ¸¸é ÄÁÆ®·ÑÀ» ¹Ýº¹ÇÏ¿© ÀûÀýÇÑ ÄÁÆ®·ÑÀ» ¸¸µé°í StringDictionary¿¡ ÀÖ´Â °ª¿¡ µû¶ó ¼Ó¼ºÀ» ¼³Á¤ÇÑ ´ÙÀ½ PlaceHolderÀÇ ÄÁÆ®·Ñ¿¡ Ãß°¡ÇÏ¸é µË´Ï´Ù. À¥ ÆäÀÌÁö¸¦ Ŭ¶óÀÌ¾ðÆ® ºê¶ó¿ìÀú·Î ·»´õ¸µÇÏ¸é µ¿ÀûÀ¸·Î »ý¼ºÇÑ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÌ Æ÷ÇÔµÇ°í ±¸¼º ÆÄÀÏ¿¡¼ Á¤ÀÇÇÑ ´ë·Î »ç¿ëÀÚ ÀÔ·ÂÀÇ À¯È¿¼ºÀÌ °Ë»çµË´Ï´Ù.
ÀÌ·¯ÇÑ ±¸ÇöÀ» À§ÇØ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·ÑÀÌ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ ³»¿¡¼ È£½ºÆ®µÇµµ·Ï Á¦ÇÑÇß½À´Ï´Ù. ½ÇÁ¦ ASPX À¥ ÆäÀÌÁö¿¡ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·ÑÀÌ ÀÖ´Â °æ¿ì ±×¿¡ µû¶ó ÀÌ ¸Þ¼µå¸¦ ¼öÁ¤Çϰųª ¿À¹ö·ÎµåÇØ¾ß ÇÕ´Ï´Ù.
»ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀÇ ÀÚ½Ä ÄÁÆ®·ÑÀ» ¹Ýº¹Çϰí PlaceHolder ÄÁÆ®·ÑÀÌ ÀÖ´ÂÁö ¿©ºÎ¸¦ °Ë»öÇÏ´Â LoadDynamicValidators ¸Þ¼µå ¼¸íÀº ´ÙÀ½°ú °°½À´Ï´Ù.
/// <summary>
/// À¯È¿¼º °Ë»ç±â¸¦ ÀÚ¸® Ç¥½ÃÀÚ¿¡ µ¿ÀûÀ¸·Î ·ÎµåÇÕ´Ï´Ù.
/// </summary>
/// <param name="placeHolder">À¯È¿¼º °Ë»ç±â¸¦ ·ÎµåÇÒ
/// ÀÚ¸® Ç¥½ÃÀÚ</param>
/// <param name="userControl">»ç¿ëÀÚ ÀÔ·Â ÇÊµå ¹×
/// À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» È£½ºÆ®ÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ</param>
public void LoadDynamicValidators( UserControl userControl )
{
foreach ( Control childControl in userControl.Controls )
{
if ( childControl is PlaceHolder )
{
// ´Ü¼øÇÑ °¡µ¶¼º Çâ»óÀ» À§ÇØ ÀÚ¸® Ç¥½ÃÀÚ ÄÁÆ®·Ñ ÇÒ´ç
PlaceHolder placeHolderControl = (PlaceHolder) childControl;
placeHolderControl º¯¼ö¸¦ »ç¿ëÇÕ´Ï´Ù. foreach ¹®ÀÇ º»¹® ³»¿¡¼ childControl ½Äº°ÀÚ¸¦ Á÷Á¢ÀûÀ¸·Î ÂüÁ¶ÇÒ ¼ö ÀÖµµ·Ï °¡µ¶¼ºÀ» Çâ»ó½Ã۱â À§ÇÑ °ÍÀÔ´Ï´Ù. ±×·¯³ª placeHolderControl º¯¼ö¸¦ »ç¿ëÇϸé Äڵ带 Á»´õ ½±°Ô Àаí ÀÌÇØÇÒ ¼ö´Â ÀÖÁö¸¸ Ãß°¡ÀûÀΠŬ·° ÁÖ±âÀÇ ¿À¹öÇìµå¿Í ¾à°£ÀÇ ¸Þ¸ð¸® ¼Ò¸ð°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀÌÁ¦ placeHolderControlÀÌ validatorCollections ÇØ½Ã Å×À̺íÀÇ ÇØ½Ã Å×ÀÌºí¿¡ Ç׸ñÀ» °¡Áö°í ÀÖ´ÂÁö È®ÀÎÇØ¾ß ÇÕ´Ï´Ù. ¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù.
// ÀÌ userControlChildControl¿¡ µ¿ÀûÀ¸·Î Ãß°¡ÇÒ
// À¯È¿¼º °Ë»ç±â ¸ñ·ÏÀ» °¡Á®¿É´Ï´Ù.
ArrayList validatorList = (ArrayList)
validatorCollections[ placeholderControl.ID ];
// µ¿ÀûÀ¸·Î »ý¼ºµÈ À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ»
// Æ÷ÇÔÇϵµ·Ï ±¸¼ºµÈ ÇÁ·Î¼¼½º ÄÁÆ®·Ñ¸¸
if ( validatorList != null )
{
validatorList°¡ nullÀÌ ¾Æ´Ï¸é Àû¿ëÇÒ À¯È¿¼º °Ë»ç±â ¸ñ·ÏÀÌ ÀÖ´Ù´Â ÀǹÌÀÔ´Ï´Ù. ÁöÁ¤ÇÑ °¢ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» µ¿ÀûÀ¸·Î »ý¼ºÇÏ°í ±×¿¡ µû¶ó ¼Ó¼ºÀ» ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù. ¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù.
// ¸ñ·Ï¿¡¼ °¢ À¯È¿¼º °Ë»ç±â¸¦ ¹Ýº¹ÇÕ´Ï´Ù.
for ( int iCnt = 0; iCnt < validatorList.Count; iCnt++ )
{
// À¯È¿¼º °Ë»ç±â¿¡ ´ëÇÑ ¼Ó¼º À̸§/°ªÀÇ ¹®ÀÚ¿ »çÀüÀ» °¡Á®¿É´Ï´Ù.
StringDictionary validatorProperties =
(StringDictionary) validatorList[iCnt];
// µ¿ÀûÀ¸·Î »ý¼ºµÈ °¢ placeholderControl »çÀÌ¿¡
// °ø¹éÀ» ¸¸µé¾î Ãß°¡ÇÕ´Ï´Ù.
// ÀÌ ÀÛ¾÷ÀÌ ¼öÇàµÇ¾ú´ÂÁö ¿©ºÎ¿Í Ãß°¡µÈ ³»¿ëÀº
// ±¸¼º ÆÄÀÏ¿¡¼ Á¶Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Literal spacer = new Literal();
spacer.Text = "?";
userControl.Controls.Add( spacer );
// ¹®ÀÚ¿ »çÀü¿¡ ÀúÀåµÈ ±¸¼º Á¤º¸¿¡ µû¶ó
// À¯È¿¼º °Ë»ç±â Çü½ÄÀ» µ¿ÀûÀ¸·Î ¸¸µé°í
// ä¿ó´Ï´Ù.
switch( validatorProperties["ValidatorType"].ToLower() )
{
// °¢ case ¹®Àº ´ÙÀ½°ú µ¿ÀÏÇÑ Çü½ÄÀ̾î¾ß ÇÕ´Ï´Ù.
// (1) ¿Ã¹Ù¸¥ Çü½ÄÀÇ À¯È¿¼º °Ë»ç±â¸¦ ¸¸µì´Ï´Ù.
// (2) À¯È¿¼º °Ë»ç±âÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù.
// (3) placeholderControl¿¡ Ãß°¡ÇÕ´Ï´Ù.
case "range":
RangeValidator rangeValidator = new RangeValidator();
SetProperties( rangeValidator, validatorProperties );
placeholderControl.Controls.Add( rangeValidator );
break;
// requiredfield, regularexpression, compare,
// validationsummary´Â °£´ÜÇÏ°Ô Çϱâ À§ÇØ ÀÌ ÄÚµå Á¶°¢¿¡¼
// »ý·«µÇ¾ú½À´Ï´Ù. ±×·¯³ª
// ÀÌ ÀμöµéÀº ¹üÀ§ À¯È¿¼º °Ë»ç±âÀÇ Àμö¿Í À¯»çÇÕ´Ï´Ù.
// »ç¿ëÀÚ ÁöÁ¤ À¯È¿¼º °Ë»ç±â´Â À̺¥Æ® 󸮱⵵ ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù.
case "custom":
CustomValidator customValidator = new CustomValidator();
SetProperties( (Control) customValidator, validatorProperties );
SetEventHandler( (Control) customValidator,
validatorProperties, userControl );
placeholderControl.Controls.Add( customValidator );
break;
}
}
validatorList·Î À妽ÌÇϰí ÀûÀýÇÏ°Ô Ä³½ºÆÃÇÏ¿© ±¸¼º ÆÄÀÏ¿¡ ÁöÁ¤µÈ ¼Ó¼º À̸§ ¹× °ªÀ» ÀúÀåÇÏ´Â ¹®ÀÚ¿ »çÀüÀ» °¡Á®¿É´Ï´Ù. ¹®ÀÚ¿ »çÀü¿¡¼ Ű´Â ´Ù¾çÇÑ ¼Ó¼º À̸§À¸·Î ¸ÅÇÎµÇ°í °ü·Ã °ªÀº ¼Ó¼º °ªÀÇ ¹®ÀÚ¿ Ç¥ÇöÀ¸·Î ¸ÅÇε˴ϴÙ.
À§ÀÇ Äڵ忡¼´Â HTML ´Ü¾î À߸² ¹æÁö °ø¹éÀ» º¸À¯ÇÏ´Â ¸®ÅÍ·²·Î ÀÚµ¿ Ãß°¡ÇÕ´Ï´Ù. ÀÌ·± °æ¿ì ±¸¼º ÆÄÀÏ¿¡¼ ¿Ã ¼ö ÀÖ½À´Ï´Ù. °øÅëµÇ°í ±âº»ÀûÀΠƯÁ¤ HTMLÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Â ValidatorCollection ¹× Validator ³ëµå»Ó¸¸ ¾Æ´Ï¶ó ´Ù¾çÇÑ Defaults ³ëµå¿¡ ÀÖ´Â "HTMLPrefix"¶ó´Â Ãß°¡ Ư¼ºÀº ½±°Ô »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ "HTMLPostfix" Ư¼ºÀ» Á¦°øÇÒ ¼ö ¾ø´Â ÀÌÀ¯´Â ¾ø½À´Ï´Ù.
¹®ÀÚ¿ »çÀüÀÇ ValidatorType Ű´Â µ¿ÀûÀ¸·Î ¸¸µé¾î¾ß ÇÏ´Â À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀÇ Çü½ÄÀ» ¾Ë·Á ÁÝ´Ï´Ù. switch ¹®À» »ç¿ëÇÏ¿© ÇØ´ç case ¹®¿¡ ´ëÇÑ È帧 Á¦¾î¸¦ Áö½ÃÇÏ°í ¸¶Áö¸·À¸·Î À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ» ¸¸µé¾î ¼Ó¼ºÀ» ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
CustomValidator ÄÁÆ®·Ñ°ú º°µµ·Î °¢ case ¹®¿¡´Â µ¿ÀÏÇÑ ÆÐÅÏÀÌ ÀÖ½À´Ï´Ù. À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» ¸¸µé°í, ¹®ÀÚ¿ »çÀü¿¡ Á¤ÀÇµÈ ´ë·Î ¼Ó¼ºÀ» ¼³Á¤Çϰí, PlaceHolder ÄÁÆ®·ÑÀ» Ãß°¡ÇÏ´Â °ÍÀÔ´Ï´Ù.
È£ÃâµÇ´Â private SetProperties ¸Þ¼µå´Â ¸Å¿ì °£´ÜÇÑ ·çƾÀ̱⠶§¹®¿¡ ÀÚ¼¼È÷ »ìÆìº¸Áö´Â ¾Ê°Ú½À´Ï´Ù. ÀÌ ¸Þ¼µå´Â ¹®ÀÚ¿ »çÀü¿¡¼ °¢ ۸¦ ¹Ýº¹ÇÏ¿© ¼Ó¼º À̸§À¸·Î ÇØ¼®ÇÕ´Ï´Ù. ¸®Ç÷º¼ÇÀ» »ç¿ëÇÏ¿© ÄÁÆ®·Ñ ¼Ó¼ºÀÇ °ªÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Â PropertyInfo °³Ã¼¸¦ °¡Á®¿É´Ï´Ù. ±×·± ´ÙÀ½ ¿Ã¹Ù¸¥ Çü½ÄÀÇ °³Ã¼¸¦ ¸¸µé°í ¸¶Áö¸·À¸·Î PropertyInfoÀÇ SetValue ¸Þ¼µå¸¦ »ç¿ëÇÏ¿© °ªÀ» ¼³Á¤ÇÕ´Ï´Ù.
¸®Ç÷º¼ÇÀ» »ç¿ëÇÏ¿© ÄÁÆ®·ÑÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇßÁö¸¸ ½ÇÁ¦ ½Ã³ª¸®¿À¿¡¼´Â ±ÇÀåµÇ´Â ¿É¼ÇÀÌ ¾Æ´Õ´Ï´Ù. 󸮷® ¹× ¼º´É °üÁ¡¿¡¼ º¼ ¶§ ¸®Ç÷º¼Ç¿¡ µå´Â ºñ¿ëÀº ³Ê¹« Å©±â ¶§¹®ÀÔ´Ï´Ù. ½ÇÁ¦·Î´Â ¸ÕÀú »ç¿ëÇÒ À¯È¿¼º °Ë»ç±âÀÇ Çü½Ä ¹× ¼³Á¤ÇÒ ¼Ó¼ºÀ» °áÁ¤ÇÏ´Â ÀÏ·ÃÀÇ switch ¹®ÀÌ ÀÖ½À´Ï´Ù. ±×·± ´ÙÀ½ ¶Ç ´Ù¸¥ switch ¹®¿¡¼ Á÷Á¢ ¼Ó¼ºÀ» °áÁ¤ÇÏ°í ¼³Á¤ÇÕ´Ï´Ù. ±×·¯³ª µ¥¸ð¿ë Äڵ带 »ó´ëÀûÀ¸·Î °£´ÜÇϰí Àб⠽±°Ô Çϱâ À§ÇØ ¸®Ç÷º¼ÇÀ» ¼±ÅÃÇÑ °ÍÀÔ´Ï´Ù.
À§ÀÇ ÄÚµå Á¶°¢¿¡¼ CustomValidator ÄÁÆ®·Ñ¿¡ ´ëÇÑ À̺¥Æ® 󸮱⠼³Á¤À» Á¦°øÇß½À´Ï´Ù. CustomValidator ÄÁÆ®·ÑÀ» »ç¿ëÇÏ¿© ÀÔ·Â ÄÁÆ®·Ñ¿¡ »ç¿ëÀÚ Á¤ÀÇ(Áï, °³¹ßÀÚ Á¤ÀÇ) À¯È¿¼º °Ë»ç ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. CustomValidator ÄÁÆ®·Ñ¿¡´Â Ç×»ó ¼¹ö ÂÊ À¯È¿¼º °Ë»ç ±â´ÉÀÌ ÀÖÀ¸¸ç Ŭ¶óÀÌ¾ðÆ® ÂÊ À¯È¿¼º °Ë»ç ±â´Éµµ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® ÂÊ À¯È¿¼º °Ë»ç ±â´ÉÀº ´Ü¼øÇÑ ¹®ÀÚ¿ ¼Ó¼ºÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¹Ç·Î Äڵ忡¼ ½±°Ô ó¸®ÇÒ ¼ö ÀÖÀ¸¸ç ´Ù¸¥ ¹®ÀÚ¿ Çü½Ä ¼Ó¼º(¿¹: ErrorMessage ¶Ç´Â Text)ó·³ ¾×¼¼½ºÇÏ¿© ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÀϹÝÀûÀ¸·Î Web Form °³¹ßÀÚ´Â Web FormÀÇ ÄÚµå ¼û±è ¶Ç´Â »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ·Î ¸Þ¼µå¸¦ ¸¸µé°í ServerValidate À̺¥Æ®¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î È£ÃâµÇµµ·Ï ÁöÁ¤ÇÕ´Ï´Ù. Visual Studio´Â ÀÌ ÀÛ¾÷À» ±¸ÇöÇϱâ À§ÇØ ºôµå ÇÁ·Î¼¼½ºÀÇ ÀϺηΠ¸ðµç ¾î·Á¿î ÀÛ¾÷À» ¹é±×¶ó¿îµå·Î ¼öÇàÇÕ´Ï´Ù. ºÒÇàÇϰԵµ ÃæºÐÇÑ ±â´ÉÀÌ ¾øÀ¸¹Ç·Î ¸®Ç÷º¼ÇÀ» »ç¿ëÇÏ¿© ÀÌ ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÕ´Ï´Ù.
´ÙÀ½°ú °°ÀÌ SetEventHandler ¸Þ¼µå¸¦ »ç¿ëÇÏ¿© À̺¥Æ®¸¦ 󸮱⸦ ¼³Á¤ÇÕ´Ï´Ù.
/// <summary>
/// »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ¿¡¼ ¸Þ¼µå¸¦ È£ÃâÇϵµ·Ï
/// À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ¿¡¼ À̺¥Æ® 󸮱⸦ ¼³Á¤ÇÕ´Ï´Ù.
/// </summary>
/// <param name="validationControl">À̺¥Æ®¸¦
/// ¹ß»ý½ÃŰ´Â À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ</param>
/// <param name="eventName">À̺¥Æ® À̸§</param>
/// <param name="methodName">È£ÃâÇÒ ¸Þ¼µå</param>
/// <param name="userControl">¸Þ¼µå°¡ ¼±¾ðµÇ´Â
/// »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ</param>
private void SetEventHandler( Control validationControl,
string eventName, string methodName, UserControl userControl)
{
if ( methodName != null && eventName != null )
{
// À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ¿¡ ´ëÇÑ °³Ã¼ Çü½ÄÀ» °¡Á®¿É´Ï´Ù.
Type childControlType = validationControl.GetType();
// À̺¥Æ®¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿É´Ï´Ù.
EventInfo eventInfo = childControlType.GetEvent( eventName );
// »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀÇ Å¬·¡½º ÀνºÅϽº¿¡¼
// ÁöÁ¤ÇÑ ¸Þ¼µå¸¦ È£ÃâÇÒ ¿Ã¹Ù¸¥ Çü½ÄÀÇ ´ë¸®ÀÚ¸¦
// ¸¸µì´Ï´Ù.
Delegate delegateEventHandler =
(Delegate) Delegate.CreateDelegate( eventInfo.EventHandlerType,
userControl, methodName);
// ÀÚ½Ä ÄÁÆ®·Ñ¿¡ ´ëÇÑ eventhandler·Î ´ë¸®ÀÚ¸¦ Ãß°¡ÇÕ´Ï´Ù.
eventInfo.AddEventHandler( validationControl, delegateEventHandler );
}
}
nullÀÌ ¾Æ´Ñ À̺¥Æ® À̸§ ¹× ¸Þ¼µå À̸§À» ÁöÁ¤Çß´Ù°í °¡Á¤ÇÏ¸é ¸ÕÀú À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ Type °³Ã¼¸¦ °¡Á®¿Í¾ß ÇÕ´Ï´Ù. ÀÌ °³Ã¼´Â ¸®Ç÷º¼Ç ±â´ÉÀÇ ·çÆ®¸¦ Çü¼ºÇϰí À̺¥Æ® Á¤º¸ °°Àº ¸ÞŸµ¥ÀÌÅÍ¿¡ ¾×¼¼½ºÇÏ´Â ±âº» ¹æ¹ýÀÔ´Ï´Ù.
Microsoft .NET FrameworkÀÇ À̺¥Æ® ¸ðµ¨¿¡´Â ±âº»ÀûÀ¸·Î À̺¥Æ®¸¦ 󸮱⿡ ¿¬°áÇÏ´Â ´ë¸®ÀÚ°¡ ÀÖ½À´Ï´Ù. ¹Ù·Î ¿©±â¼ ¼öÇàÇÏ·Á´Â ÀÛ¾÷ÀÌ À̺¥Æ®¸¦ 󸮱⿡ ¿¬°áÇÏ´Â ÀÛ¾÷ÀÔ´Ï´Ù.
´ë¸®ÀÚ Å¬·¡½º´Â ¸Þ¼µå¿¡ ´ëÇÑ ÂüÁ¶¸¦ º¸°üÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ù¸¥ Ŭ·¡½º¿Í ´Þ¸® ´ë¸®ÀÚ Å¬·¡½º´Â °íÀ¯ÇÑ ¼¸í°ú ÀÏÄ¡ÇÏ´Â ¸Þ¼µå¿¡ ´ëÇÑ ÂüÁ¶¸¸ º¸°üÇÒ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼ ´ë¸®ÀÚ´Â Çü½ÄÀÌ ¾ÈÀüÇÑ ÇÔ¼ö Æ÷ÀÎÅÍ¿Í °°½À´Ï´Ù.
À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ Type °³Ã¼¿¡¼ GetEvent¸¦ È£ÃâÇÏ¿© ÁöÁ¤ÇÑ À̺¥Æ®¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿É´Ï´Ù. ÀÌ·¸°Ô Çϸé ÀÌ À̺¥Æ®¿Í °ü·ÃµÈ 󸮱âÀÇ Type °³Ã¼¿¡ ¾×¼¼½ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °³Ã¼¿¡¼ ¿Ã¹Ù¸¥ Çü½ÄÀÇ ´ë¸®ÀÚ¸¦ µ¿ÀûÀ¸·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
Delegate Ŭ·¡½ºÀÇ Á¤Àû CreateDelegate ¸Þ¼µå¿¡ ¿À¹ö·Îµå°¡ ¸¹½À´Ï´Ù. ¿©±â¼ »ç¿ëÇÏ´Â ¿À¹ö·Îµå¸¦ ÅëÇØ ÁöÁ¤µÈ Ŭ·¡½ºÀÇ ÁöÁ¤µÈ ÀνºÅϽº ¸Þ¼µå¿¡ ´ëÇÑ ´ë¸®ÀÚ ¶Ç´Â ÇÔ¼ö Æ÷ÀÎÅÍ·Î »ý°¢ÇÒ ¼ö ÀÖ´Â ´ë¸®ÀÚ¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ °³Ã¼¿¡ ±¸ÇöµÈ methodName ¸Å°³ º¯¼ö·Î ÁöÁ¤ÇÑ ¸Þ¼µå¸¦ È£ÃâÇÒ ¿Ã¹Ù¸¥ Çü½ÄÀÇ ´ë¸®ÀÚ¸¦ ¸¸µì´Ï´Ù.
´ë¸®ÀÚ À̺¥Æ® 󸮱Ⱑ ÀÖÀ¸¸é eventInfoÀÇ AddEventHandler¸¦ ó¸®ÇÏ¿© À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ¿¡ Ãß°¡¸¸ ÇÏ¸é µË´Ï´Ù. ÀÌ ÀÛ¾÷ÀÌ ¿Ï·áµÇ¸é À¯È¿¼º °Ë»ç ÄÁÆ®·Ñ¿¡¼ À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§¸¶´Ù »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀÇ ÀνºÅϽº¿¡¼ ÁöÁ¤ÇÑ ¸Þ¼µå¸¦ È£ÃâÇÕ´Ï´Ù.
DynamicValidationManager »ç¿ë
ÀÌÁ¦ ÁöÁ¤µÈ ±¸¼º ÆÄÀÏ¿¡ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀ» µ¿ÀûÀ¸·Î »ý¼ºÇÏ¿© ´Ù¾çÇÑ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·Ñ¿¡ Àû¿ëÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» ±¸ÇöÇϴ Ŭ·¡½º°¡ ÀÖ½À´Ï´Ù.
±×·±µ¥ À¥ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ ÀÌ Å¬·¡½º¸¦ ¾î¶»°Ô »ç¿ëÇØ¾ß ÇÒ±î¿ä? ¹æ¹ýÀº ¸Å¿ì °£´ÜÇÕ´Ï´Ù. ÀÌ ±â»ç¿¡ Æ÷ÇÔµÈ À¥ ÀÀ¿ë ÇÁ·Î±×·¥ ÇÁ·ÎÁ§Æ®¿¡¼ »ç¿ëÀڷκÎÅÍ Á¤º¸¸¦ ¼öÁýÇÏ´Â ¸î °¡Áö ÆûÀ» ¸¸µé¾ú½À´Ï´Ù. ±âº»ÀûÀ¸·Î ¹«·á ÀüÀÚ ¸ÞÀÏ °èÁ¤¿¡ ´ëÇÑ Á¤º¸¸¦ µî·ÏÇÕ´Ï´Ù. ÀÌ Á¤º¸¸¦ ÀÔ·ÂÇÏ¸é »ç¿ëÀÚ´Â ÀÚ½ÅÀÇ °èÁ¤À¸·Î ·Î±×ÀÎÇÒ ¼ö ÀÖÀ¸¸ç ½ÇÁ¦ ÀÀ¿ë ÇÁ·Î±×·¥ÀÎ °æ¿ì¿¡´Â ÀüÀÚ ¸ÞÀÏÀ» º¸³»°í ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.
ÀÌ¹Ì "ÇÑ ÆäÀÌÁö À¥ ÀÀ¿ë ÇÁ·Î±×·¥"¿¡ ´ëÇÑ °£´ÜÇÑ ÆûÀ» ±¸ÇöÇß½À´Ï´Ù. ÀÌ ´ÜÀÏ ÆäÀÌÁö´Â "ÆäÀÌÁö" Request ¸Å°³ º¯¼ö¿¡¼ ÁöÁ¤ÇÑ ´ë·Î ´Ù¾çÇÑ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀ» ·ÎµåÇÕ´Ï´Ù. Áï, ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Àüü ºñÁî´Ï½º ³í¸®°¡ ÀÏ·ÃÀÇ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ¿¡¼ ½ÇÁ¦·Î ±¸ÇöµË´Ï´Ù.
System.Web.UI.UserControl¿¡¼ ÆÄ»ýµÇ´Â DVCUserControlÀ̶ó´Â µµ¿ì¹Ì Ŭ·¡½º¿¡¼ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀÌ ÆÄ»ýµÇµµ·Ï »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ¿¡ ´ëÇÑ ÄÚµå ¼û±èÀ» ¼öÁ¤ÇÕ´Ï´Ù. »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀÇ ÀνºÅϽº¸¦ ¸¸µå´Â µ¥ ÇÊ¿äÇÑ Ãß°¡ ´Ü°è¸¦ ¼öÇàÇÒ ¼ö ÀÖµµ·Ï OnInit ¸Þ¼µå¸¦ ÀçÁ¤ÀÇÇÕ´Ï´Ù. À¯È¿¼º °Ë»ç±â ÄÁÆ®·ÑÀ» »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·ÑÀÇ ´Ù¾çÇÑ ÀÚ¸® Ç¥½ÃÀÚ¿¡ µ¿ÀûÀ¸·Î ·ÎµåÇÒ ¶§ µ¿Àû À¯È¿¼º °Ë»ç °ü¸®ÀÚÀÇ LoadDynamicValidators ¸Þ¼µå¸¸ È£ÃâÇÏ¸é µË´Ï´Ù.
¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù.
/// <summary>
/// ÀÌ ÀνºÅϽº¸¦ ¸¸µé°í ¼³Á¤ÇÏ´Â µ¥ ÇÊ¿äÇÑ
/// ÃʱâÈ ´Ü°è ¼öÇà¿¡ »ç¿ëµË´Ï´Ù.
/// </summary>
/// <param name="e">À̺¥Æ® Àμö</param>
protected override void OnInit( EventArgs e)
{
// ÀÌ »ç¿ëÀÚ Á¤ÀÇ ÄÁÆ®·Ñ¿¡ ´ëÇØ µ¿ÀûÀ¸·Î »ý¼ºµÈ ¸ðµç À¯È¿¼º °Ë»ç±â¸¦ ·ÎµåÇÕ´Ï´Ù.
DynamicValidationManager.LoadDynamicValidators( this );
}
°á·Ð
ÀÌ ±â»ç¿¡¼´Â À¥ ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ µ¿Àû »ý¼º ±¸Çö ¸ÞÄ¿´ÏÁò¿¡ ´ëÇØ ¼³¸íÇß½À´Ï´Ù. ÀÌ ¸ÞÄ¿´ÏÁòÀº ºñ½ÁÇÑ Á¤º¸¿¡ ´ëÇÑ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·ÑÀÌ ¿©·¯ ÆäÀÌÁö¿¡ °ÉÃÄ Àְųª À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ ±âº» ¼Ó¼ºÀÌ ÀÚÁÖ º¯°æµÇ´Â °æ¿ì¿¡ °¡Àå È¿À²ÀûÀÔ´Ï´Ù.
ÀÌ ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇϸé À¥ °³¹ßÀÚµéÀº »ç¿ëÀÚ ÀÔ·Â À¯È¿¼º °Ë»ç¿¡ ÁýÁßÇÒ ÇÊ¿ä ¾øÀÌ ºñÁî´Ï½º ³í¸® ±¸Çö¿¡¸¸ ÁýÁßÇÒ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼ ÀÌ ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇϸé ÃÖÁ¾ »ç¿ëÀÚ È¯°æÀÇ Àϰü¼ºÀ» Çâ»ó½Ãų »Ó¸¸ ¾Æ´Ï¶ó °³¹ßÀÚ »ý»ê¼ºµµ µ¿½Ã¿¡ ³ôÀÏ ¼ö ÀÖ½À´Ï´Ù.