AUTO
[ID/PWã±â] [ȸ¿ø°¡ÀÔ]
´º½º¿Í Á¤º¸ (262)
ÀÚÀ¯ °Ô½ÃÆÇ (372)
°¡ÀÔ Àλç (1946)
°øÁö»çÇ× (5)
AJAX ÇнÀ (63)
ASP Áú¹® (65)
ASP ÇнÀ (265)
MYSQL ÇнÀ (66)
SQLSERVER ÇнÀ (327)
¿À¶óŬ ÇнÀ (60)
µ¥ÀÌŸº£À̽º ÇнÀ (23)
¾×¼Ç½ºÅ©¸³Æ® ÇнÀ (255)
¾×¼Ç½ºÅ©¸³Æ® Áú¹® (57)
ÆÛ¿Â Ç÷¡½Ã (198)
Ç÷¡½Ã ³×ºñ°ÔÀÌ¼Ç (52)
Ç÷¡½Ã ¼Ò½º (525)
Ç÷¡½Ã ¿¬±¸½Ç (529)
Ç÷¡½Ã Áú¹® (640)
Ç÷¡½Ã °ÔÀÓ (46)
Ç÷¡½Ã ÀÎÆ®·Î (37)
Ç÷¡½Ã ÀÌÆåÆ® (38)
ÀÚÀÛ Ç÷¡½Ã (76)
ű×,HTML Áú¹® (34)
ű×,HTML ÇнÀ (124)
ÀÚ¹Ù,JSP ÇнÀ (154)
ÀÚ¹Ù,JSP Áú¹® (63)
ÀÚ¹Ù½ºÅ©¸³Æ® ÇнÀ (216)
ÀÚ¹Ù½ºÅ©¸³Æ® ¼Ò½º (67)
ÀÚ¹Ù½ºÅ©¸³Æ® Áú¹® (73)
Æ÷Åä¼¥ Áú¹® (101)
Æ÷Åä¼¥ ÇнÀ (360)
Ãßõ À̹ÌÁö (233)
ÀÚÀÛ À̹ÌÁö (73)
ÆÛ¿Â À̹ÌÁö (437)
PHP Áú¹® (56)
PHP ÇÔ¼ö (2649)
PHP ÇнÀ (655)
ÇÁ·Î±×·¡¹Ö ÇнÀ (199)
ÀÎÅͳݼ­¹ö ÇнÀ (338)
ÀÎÅͳݼ­¹ö Áú¹® (14)
³×À̹ö ¼Ó ȨÇǵðÀÚÀδåÄÄ
´ÙÀ½ ¼Ó ȨÇǵðÀÚÀδåÄÄ
±¸±Û ¼Ó ȨÇǵðÀÚÀδåÄÄ
¿¥ÆÄ½º ¼Ó ȨÇǵðÀÚÀδåÄÄ
¾ßÈÄ ¼Ó ȨÇǵðÀÚÀδåÄÄ
³×ÀÌÆ® ¼Ó ȨÇǵðÀÚÀδåÄÄ
½ÎÀÌ¿ùµå ȨÇǵðÀÚÀδåÄÄ
¿¥¿¡½º¿£ ȨÇǵðÀÚÀδåÄÄ
  ȨÇǵðÀÚÀδåÄÄ > ASP ÇнÀ
   
  À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ µ¿Àû »ý¼º
  ±Û¾´ÀÌ : ¼Õ´Ô     ³¯Â¥ : 05-07-25 10:47     Á¶È¸ : 3186    
   http://cafe.naver.com/q69/7169 (403)

À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ µ¿Àû »ý¼º

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¿¡¼­¿Í °°Àº µ¥ÀÌÅÍ ±¸Á¶¸¦ ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ±×·¯·Á¸é ´ÙÀ½ ´Ü°è¸¦ ¼öÇàÇØ¾ß ÇÕ´Ï´Ù.

  1. °ü¸®ÀÚÀÇ °³ÀÎ ¼Ó¼º°ú »ý¼ºÀÚ ¼­¸íÀ» Á¤ÀÇÇÕ´Ï´Ù.
  2. ±¸¼º ÆÄÀÏÀ» XML ¹®¼­·Î ·ÎµåÇÕ´Ï´Ù.
  3. °ø¿ë ¹× ±âº» ¼Ó¼º °ªÀ» ·ÎµåÇÕ´Ï´Ù.
  4. °¢ À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ¹Ýº¹ÇÕ´Ï´Ù.
    °³º° À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀ» ·ÎµåÇÕ´Ï´Ù.
    À¯È¿¼º °Ë»ç±â¿¡ ´ëÇØ Á¤ÀÇµÈ °¢ ¼Ó¼ºÀ» ¹Ýº¹ÇÕ´Ï´Ù.
    °ø¿ë/±âº» ¼Ó¼º °ªÀÌ Á¤ÀǵǾî ÀÖÀ¸¸é ¹®ÀÚ¿­ »çÀü¿¡ »ðÀÔÇÕ´Ï´Ù.
    ¹®ÀÚ¿­ »çÀü¿¡¼­ ƯÁ¤ ¼Ó¼º °ªÀ» µ¤¾î¾²°Å³ª »ðÀÔÇÕ´Ï´Ù.
    À¯È¿¼º °Ë»ç±âÀÇ ¹è¿­ ¸ñ·Ï¿¡ ¹®ÀÚ¿­ »çÀüÀ» Ãß°¡ÇÕ´Ï´Ù.
    À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀÇ ÇØ½Ã Å×ÀÌºí¿¡ ¹è¿­ ¸ñ·ÏÀ» Ãß°¡ÇÕ´Ï´Ù.
  5. ÀÌ·¯ÇÑ ´Ü°è¸¦ ±¸ÇöÇÒ ÄÚµå´Â ¾Æ·¡¿¡ ³ª¿Í ÀÖ½À´Ï´Ù.

°³ÀÎ ¼Ó¼º ¹× »ý¼ºÀÚ ¼­¸í Á¤ÀÇ

µ¿Àû À¯È¿¼º °Ë»ç °ü¸®ÀÚ¿¡ ´ëÇØ µÎ °³ÀÇ °³ÀÎ ¼Ó¼ºÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù. Çϳª´Â ó¸®ÇÒ À¯È¿¼º °Ë»ç±â ÄÁÆ®·Ñ Á¾·ù ¸ñ·ÏÀÌ°í ´Ù¸¥ Çϳª´Â À¯È¿¼º °Ë»ç±â Ä÷º¼ÇÀÇ ÇØ½Ã Å×À̺íÀÔ´Ï´Ù. »ý¼ºÀÚ ¼­¸í¿¡´Â ±¸¼º ÆÄÀÏ °æ·Î¸¦ Á¤ÀÇÇÏ´Â ¸Å°³ º¯¼ö°¡ Æ÷ÇԵ˴ϴÙ. ¾Æ·¡¸¦ º¸¸é ÀÚ¼¼È÷ ¾Ë ¼ö ÀÖ½À´Ï´Ù.

// ´ÙÀ½Àº Á¦°øÇÒ À¯È¿¼º °Ë»ç±â Çü½ÄÀÔ´Ï´Ù.
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 );
}

°á·Ð

ÀÌ ±â»ç¿¡¼­´Â À¥ ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ µ¿Àû »ý¼º ±¸Çö ¸ÞÄ¿´ÏÁò¿¡ ´ëÇØ ¼³¸íÇß½À´Ï´Ù. ÀÌ ¸ÞÄ¿´ÏÁòÀº ºñ½ÁÇÑ Á¤º¸¿¡ ´ëÇÑ »ç¿ëÀÚ ÀÔ·Â ÄÁÆ®·ÑÀÌ ¿©·¯ ÆäÀÌÁö¿¡ °ÉÃÄ Àְųª À¯È¿¼º °Ë»ç ÄÁÆ®·ÑÀÇ ±âº» ¼Ó¼ºÀÌ ÀÚÁÖ º¯°æµÇ´Â °æ¿ì¿¡ °¡Àå È¿À²ÀûÀÔ´Ï´Ù.

ÀÌ ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇϸé À¥ °³¹ßÀÚµéÀº »ç¿ëÀÚ ÀÔ·Â À¯È¿¼º °Ë»ç¿¡ ÁýÁßÇÒ ÇÊ¿ä ¾øÀÌ ºñÁî´Ï½º ³í¸® ±¸Çö¿¡¸¸ ÁýÁßÇÒ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼­ ÀÌ ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇϸé ÃÖÁ¾ »ç¿ëÀÚ È¯°æÀÇ Àϰü¼ºÀ» Çâ»ó½Ãų »Ó¸¸ ¾Æ´Ï¶ó °³¹ßÀÚ »ý»ê¼ºµµ µ¿½Ã¿¡ ³ôÀÏ ¼ö ÀÖ½À´Ï´Ù.


   

 
´º½º¿Í Á¤º¸ ¡¤ ÀÚÀ¯ °Ô½ÃÆÇ ¡¤ °¡ÀÔ ÀÎ»ç ¡¤ °øÁö»çÇ× ¡¤ AJAX ÇнÀ ¡¤ ASP Áú¹® ¡¤ ASP ÇнÀ ¡¤ MYSQL ÇнÀ ¡¤ SQLSERVER ÇнÀ ¡¤ ¿À¶óŬ ÇнÀ ¡¤ µ¥ÀÌŸº£À̽º ÇнÀ ¡¤ ¾×¼Ç½ºÅ©¸³Æ® ÇнÀ ¡¤ ¾×¼Ç½ºÅ©¸³Æ® Áú¹® ¡¤ ÆÛ¿Â Ç÷¡½Ã ¡¤ Ç÷¡½Ã ³×ºñ°ÔÀÌ¼Ç ¡¤ Ç÷¡½Ã ¼Ò½º ¡¤ Ç÷¡½Ã ¿¬±¸½Ç ¡¤ Ç÷¡½Ã Áú¹® ¡¤ Ç÷¡½Ã °ÔÀÓ ¡¤ Ç÷¡½Ã ÀÎÆ®·Î ¡¤ Ç÷¡½Ã ÀÌÆåÆ® ¡¤ ÀÚÀÛ Ç÷¡½Ã ¡¤ ű×,HTML Áú¹® ¡¤ ű×,HTML ÇнÀ ¡¤ ÀÚ¹Ù,JSP ÇнÀ ¡¤ ÀÚ¹Ù,JSP Áú¹® ¡¤ ÀÚ¹Ù½ºÅ©¸³Æ® ÇнÀ ¡¤ ÀÚ¹Ù½ºÅ©¸³Æ® ¼Ò½º ¡¤ ÀÚ¹Ù½ºÅ©¸³Æ® Áú¹® ¡¤ Æ÷Åä¼¥ Áú¹® ¡¤ Æ÷Åä¼¥ ÇнÀ ¡¤ Ãßõ À̹ÌÁö ¡¤ ÀÚÀÛ À̹ÌÁö ¡¤ ÆÛ¿Â À̹ÌÁö ¡¤ PHP Áú¹® ¡¤ PHP ÇÔ¼ö ¡¤ PHP ÇнÀ ¡¤ ÇÁ·Î±×·¡¹Ö ÇнÀ ¡¤ ÀÎÅͳݼ­¹ö ÇнÀ ¡¤ ÀÎÅͳݼ­¹ö Áú¹®¡¤ Ç÷¡½Ã »ùÇà ¼Ò½º ¡¤ Ç÷¡½Ã äÆÃ¹æ ¡¤ Ç÷¡½Ã ¹Ì´ÏȨÇÇ ¡¤ Ç÷¡½Ã °¶·¯¸® ¡¤ Ç÷¡½Ã RSS¸®´õ ¡¤ Ç÷¡½Ã PHP »çÀü ¡¤ Ç÷¡½Ã ¿ìÆí¹øÈ£ ã±â ¡¤ Ç÷¡½Ã ÇÑÀÚ°ÔÀÓ ¡¤ Ç÷¡½Ã ´Þ·Â°ú½Ã°è ¡¤ Ç÷¡½Ã Æ÷Åä¶óÀ̺귯¸® ¡¤ ·£´ýÀ̹ÌÁö ¡¤ Ç÷¡½Ã ´Þ·Â°ú½Ã°è ¡¤ ÇÑ±Û µµ¸ÞÀÎ ¡¤ ³×À̹ö ºí·Î±× ½ºÅ©·¦ ¡¤ ½ÎÀÌ¿ùµå ¹Ì´ÏȨÇÇ °¶·¯¸® ¡¤ ½ÎÀÌ¿ùµå ¹Ì´ÏȨÇÇ µî·Ï ¡¤ ÇÁ·Î°ÔÀÌ¸Ó ·©Å© ¡¤ ȨÆäÀÌÁöÁ¤º¸ ºí·Î±×
Copyright ¨Ï hompy.info. All rights reserved.