닷넷으로 개발을 하다보면 반드시 웹서버 콘트롤을 쓸 수 밖에 없는 경우가 생긴다. 그런데, 이 웹서버 콘트롤들이 웹표준을 따르지 않는 경우가 많다. 예를 들어서 불필요한 테이블 태그로 디자인을 한다거나 하는 경우 말이다. 또한 자주 쓰는 콘트롤 중에는 라디오박스 리스트, 체크박스리스트 등과 같은 리스트 콘트롤들이 있는데, 이걸 쓸데없이 테이블 태그로 감싸놓았다. 언제쯤 이런 콘트롤들이 CSS Friendly 하게 변하려나...
우얏든둥, MS에서는 이 사실을 인지하고 있는 듯 싶고, 공식적인 대응이라기 보다는 요 위의 코드플렉스 프로젝트인 CSS Friendly Control Adapters 를 이용해서 해결하려는 듯 싶다. 저걸 이용하면 많은 부분 해결을 할 수 있겠지만, 해당사항이 없는건 또 직접 만들어서 써야겠지.
아래 코드는 렌더링 상황에서 어떻게 테이블 태그를 없앨 수 있는지에 대한 내용이다. VB 코드로 짜놓은 거니 C#으로는 알아서 변형시키면 될 듯.
Public Class WebPartZoneControlAdapter Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter Protected sw As StringWriter = Nothing Protected hw As HtmlTextWriter = Nothing Public Sub New() sw = New StringWriter hw = New HtmlTextWriter(sw) End Sub Protected Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter) 'MyBase.RenderBeginTag(writer) End Sub Protected Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter) 'MyBase.RenderEndTag(writer) End Sub Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter) MyBase.RenderContents(Me.hw) Dim org As String = Me.sw.ToString() ' Removes table, tr and td tags while rendering Dim html As String = Regex.Replace(org, "<[/]?(table|tr|td|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase) writer.Write(html) End Sub End Class
그다음에 App_Browsers 디렉토리를 만들고 그 안에 form.browser 파일을 만들어 아래 내용을 집어 넣으면 끝.
[browsers] [browser refID="Default"] [controlAdapters] [adapter controlType="System.Web.UI.WebControls.WebPartZone" adapterType="WebPartZoneControlAdapter" /] [/controlAdapters] [/browser] [/browsers]
비슷한 방식으로 하면 다른 콘트롤들도 렌더링 할 때 불필요한 테이블 태그들을 없앨 수 있다.
참 쉽지? ^^
출처 : http://blog.daum.net/justinsays/6603080