다음을 통해 공유


ASP.NET 및 XHTML

업데이트: 2007년 11월

ASP.NET을 사용하면 XHTML 표준에 맞는 웹 페이지를 만들 수 있습니다. XHTML은 HTML을 XML 문서로 정의하는 W3C(World Wide Web 컨소시엄) 표준입니다. XHTML 표준에 맞는 웹 페이지를 만들면 다음과 같은 몇 가지 이점을 얻을 수 있습니다.

  • 페이지의 요소가 올바른 형식으로 구성됩니다.

  • 대부분의 브라우저는 XHTML을 지원하는 방식으로 변하고 있으므로 XHTML 표준에 맞는 페이지를 만들면 모든 브라우저에서 일관성 있게 렌더링되는 페이지를 만들 수 있습니다.

  • XHTML을 사용하면 페이지에서 내게 필요한 옵션 표준을 보다 쉽게 따를 수 있습니다.

  • XHTML은 확장 가능하여 새 요소를 정의할 수 있습니다.

  • 웹 페이지를 사용자가 읽지 않고 컴퓨터에서 처리하는 경우 프로그래밍 방식으로 XHTML 페이지를 훨씬 쉽게 읽을 수 있으며 변환을 통해 문서를 조작할 수 있습니다.

W3C에서는 XHTML 1.0 Transitional, XHTML 1.0 Frameset, XHTML 1.0 Strict 및 XHTML 1.1과 같이 몇 단계의 XHTML 규칙을 지정했습니다. 이 중에서 XHTML 1.1 사양이 가장 엄격합니다. XHTML 1.0 Frameset 및 Transitional 사양에서는 XML 기반 HTML 태그를 정의하지만 널리 사용되는 특정 구문도 허용됩니다. 대부분의 기존 웹 페이지는 XHTML 1.0 Frameset 또는 Transitional 사양에 맞게 만들 수 있지만, XHTML 1.0 Strict 또는 XHTML 1.1 사양에 맞게 만들려면 해당 사양에서 허용되지 않는 구문을 사용하여 구현된 기능을 대체하기 위해 상당한 양의 수정을 해야 합니다.

XHTML 표준에 대한 자세한 내용은 W3C 웹 사이트에서 Second Edition of XHTML 1.0 사양을 참조하십시오.

XHTML 규격 준수를 위한 ASP.NET 기능

XHTML은 HTML보다 엄격한 방식으로 요소와 특성을 정의합니다. 기본적으로 ASP.NET에서 생성하는 모든 태그 및 ASP.NET에 포함된 웹 서버 컨트롤은 XHTML 1.0 Transitional 표준을 따릅니다. 대부분의 경우 ASP.NET에서 생성하는 태그는 XHTML 1.1 표준도 따릅니다. 다른 설명이 없는 경우 이 항목에서 XHTML 표준이라고 하면 XHTML 1.0과 XHTML 1.1을 모두 나타냅니다.

다음은 HTML과 다른 몇 가지 XHTML 규칙입니다.

  • 모든 요소는 명시적으로 닫는 태그를 포함하거나 /> 태그를 사용하여 자체적으로 닫힙니다.

  • 태그 및 특성 이름은 소문자로 렌더링되고 특성 값은 큰따옴표 안에 포함됩니다. 예를 들어 GridView 컨트롤을 페이지에 사용하는 경우, 페이지가 렌더링되면 GridView 컨트롤은 XHTML 표준에 맞는 HTML을 생성합니다. 생성된 모든 요소는 여는 태그와 닫는 태그를 명시적으로 사용하거나 자체적으로 닫는 태그를 사용하고 특성 값은 큰따옴표 안에 포함됩니다.

  • 서식 정보는 CSS 스타일시트의 스타일만 사용하여 렌더링됩니다. 페이지에 XHTML DOCTYPE 요소가 포함되어 있는 경우 ASP.NET 컨트롤은 이 표준을 지원하기 위해 bgcolor와 같이 XHTML 표준에 맞지 않는 font 요소나 특성을 렌더링하지 않습니다.

  • ASP.NET에서 Repeater, GridView 및 다른 컨트롤과 같이 컨트롤이 ID를 생성하는 경우 ID의 형식은 XHTML 1.0 Transitional 지침을 따릅니다.

  • ASP.NET에서는 action 특성을 form 요소에 동적으로 추가합니다. 기본적으로 form 요소에는 name 특성이 포함되는데, 이 특성은 XHTML 1.0 Transitional 사양에서 사용할 수 있습니다. 이렇게 하면 폼 이름을 사용하여 form 요소를 처리하는 클라이언트 스크립트 기반의 기존 응용 프로그램과 호환성이 유지됩니다.

    참고:

    XHTML 1.1 지침에서는 form 요소의 name 특성을 사용할 수 없습니다. name 특성을 렌더링하지 않도록 응용 프로그램을 구성할 수 있습니다. 자세한 내용은 이 항목의 뒷부분에 있는 "ASP.NET 페이지 및 컨트롤의 XHTML 렌더링 제어"를 참조하십시오.

  • XHTML에서는 모든 요소가 컨테이너 요소에 포함되어야 하므로 input 요소와 같은 ASP.NET 컨트롤이 div 요소에서 렌더링됩니다. 여기에는 TextBox, CheckBox, RadioButton 컨트롤 등의 컨트롤에 대해 렌더링되는 HTML 태그가 포함됩니다. 또한 뷰 상태 데이터를 저장하는 데 사용되는 요소와 같은 숨김 필드도 포함됩니다.

  • ASP.NET에서는 문자를 인코딩합니다. 예를 들면 &를 &로 인코딩합니다. 여기에는 ECMAScript를 참조하기 위해 생성된 URL과 인코딩된 값(예: 뷰 상태)의 내용이 포함됩니다.

  • 페이지에 렌더링되는 script 요소는 적절한 type 특성을 사용하고(예: type="type/javascript") language 특성을 포함하지 않습니다. 이것은 클라이언트 스크립트에서 다시 게시를 수행해야 하는 컨트롤(예: HyperLink, LinkButton, CalendarTreeView 컨트롤과 유효성 검사기 컨트롤) 또는 페이지와 RegisterHiddenField, RegisterStartupScript 및 RegisterClientScriptBlock 메서드에서 만드는 스크립트와 관련이 있습니다. 사용자가 만드는 스크립트 블록은 type 특성을 사용하여 자동으로 수정되지 않습니다.

  • ASP.NET에서 스크립트 블록을 렌더링하는 경우 스크립트 블록의 내용이 XML(HTML) 주석 내부에서 렌더링됩니다.

ASP.NET 페이지 및 컨트롤의 XHTML 렌더링 제어

경우에 따라 ASP.NET 컨트롤에서 XHTML 1.1 사양에 지정된 보다 엄격한 형식으로 태그를 렌더링할 수도 있습니다. 기본 렌더링에서는 XHTML 1.1 사양을 따르지 않는 일부 태그를 포함할 수 있습니다. 예를 들어, XHTML 1.1 표준의 경우 HTML form 요소에 name 특성을 사용할 수 없습니다.

반대로 ASP.NET이 XHTML 1.0 Transitional 사양을 따르지 않는 태그를 렌더링할 수도 있습니다. 일반적으로 이전 버전의 ASP.NET에서 지원하지만 XHTML 표준에 맞지 않는 태그나 특성을 사용하는 기존 페이지를 예로 들 수 있습니다.

웹 사이트에서 태그를 렌더링하도록 구성하는 방법은 다음과 같이 세 가지입니다.

  • Legacy(이전 버전의 ASP.NET에서 태그가 렌더링되는 방식과 비슷함)

  • Transitional(XHTML 1.0 Transitional)

  • Strict(XHTML 1.0 Strict)

자세한 내용은 방법: ASP.NET 웹 사이트에서 XHTML 렌더링 구성을 참조하십시오.

참고:

Legacy 태그를 렌더링하는 옵션은 주로 기존 페이지를 현재 버전의 ASP.NET으로 마이그레이션하기 위해 제공되며 ASP.NET의 다음 버전에서는 지원되지 않을 수도 있습니다.

Legacy 렌더링

렌더링을 Legacy로 설정한 경우 ASP.NET 페이지와 컨트롤은 렌더링을 ASP.NET 이전 버전의 동작으로 변경합니다. 예를 들면 다음과 같은 내용이 변경됩니다.

  • form 요소는 name 특성을 사용하여 렌더링됩니다.

  • ASP.NET에서 form 요소 내에 있는 div 요소를 자동으로 컨트롤의 컨테이너로 렌더링하지 않습니다.

  • 유효성 검사기 컨트롤은 controltovalidate 같은 사용자 지정 특성을 사용하여 span 요소로 렌더링됩니다.

  • alt 및 src 특성을 명시적으로 포함하지 않으면 img 요소에서 이러한 특성을 렌더링하지 않습니다.

  • 자동 다시 게시 동작을 지원해야 하는 경우 컨트롤은 language 특성을 렌더링합니다(예: language="javascript").

  • 컨트롤의 Wrap 속성이 false로 설정되어 있으면 div 요소를 렌더링하는 컨트롤(예: Panel 컨트롤)에 nowrap 특성이 포함됩니다.

  • ImageButton 컨트롤이 border 특성을 렌더링합니다.

  • 페이지에 렌더링되는 br 요소가 <br>로 렌더링됩니다. 그러나 <br /> 태그를 명시적으로 포함하면 페이지에서 이 태그가 있는 그대로 렌더링됩니다.

  • DataGridCalendar 컨트롤에 BackColor 속성이 설정되어 있으면 렌더링된 table 요소에 bordercolor 특성이 포함됩니다.

DOCTYPE 요소 및 XHTML 네임스페이스 지정

올바른 XHTML 웹 페이지에는 해당 페이지를 XHTML 페이지로 식별하고 규칙을 준수할 대상 XHTML 스키마를 참조하는 DOCTYPE 선언이 포함되어야 합니다. 또한 XHTML 네임스페이스를 참조하는 특성도 페이지의 HTML 태그에 포함되어야 합니다. 페이지가 렌더링될 때 ASP.NET에서 DOCTYPE 선언을 자동으로 만들지 않습니다. 대신 적절한 XML 네임스페이스 참조를 사용하여 DOCTYPE 선언을 만들어야 합니다.

참고:

Visual Studio와 같은 비주얼 디자이너에는 보통 DOCTYPE 선언이 포함된 기본 페이지 템플릿이 있습니다. 비주얼 디자이너를 사용하는 경우에는 필요한 DOCTYPE 선언이 포함된 새 페이지를 생성하는지 확인합니다.

다음 코드 예제에서는 페이지에 추가할 수 있는 DOCTYPE 선언을 보여 줍니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >

DOCTYPE 선언이 자동으로 생성되지 않도록 하면 ASP.NET에서 브라우저의 렌더링에 대해 보다 많은 유연성을 가집니다. 이러한 브라우저는 DOCTYPE 선언에 지정할 수 있는 다양한 HTML 표준을 서로 다른 수준으로 준수합니다.

참고:

DOCTYPE 선언을 제거하면 XHTML 규격을 준수할 수 없습니다. 페이지가 XHTML 페이지로 간주되지 않으며 XHTML 스키마를 참조하지 않습니다.

또한 대부분의 브라우저는 DOCTYPE 선언과 XML 네임스페이스 선언이 있는지 여부에 따라 렌더링을 변경합니다. 이러한 요소가 있으면 일반적으로 브라우저는 표준 기반 렌더링을 사용합니다. 이 요소가 없는 경우 대부분의 브라우저는 브라우저 형식에 따라 달라지는 브라우저 특정 규칙을 사용하여 렌더링("불확정 모드" 렌더링이라고도 함)하므로 예기치 않은 렌더링 결과가 나타날 수 있습니다.

마찬가지로 페이지의 MIME 형식을 제어할 수 있습니다. 기본적으로 페이지에서는 MIME 형식을 text/html로 설정합니다. 그러나 다음 코드 예제와 같이 @ Page 지시문에 ContentType 특성을 설정하여 페이지의 MIME 형식을 재정의할 수 있습니다.

<%@ Page Language="VB" ContentType="application/xhtml+xml" %>
<%@ Page Language="C#" ContentType="application/xhtml+xml" %>

필수 XHTML 요소를 포함하는 ASP.NET 페이지 예제

다음 코드 예제에서는 XHTML 규칙을 준수하는 간단한 ASP.NET 페이지를 보여 줍니다.

<%@ Page Language="VB" AutoEventWireup="false" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<script >
Sub Button1_Click(sender As Object, e As EventArgs)
    Label1.Text = "Built at " & DateTime.Now.ToString()
End Sub

Sub listFruit_SelectedIndexChanged(sender As Object, e As EventArgs)
    Label1.Text = "You selected " & listFruit.SelectedItem.Text
End Sub
</script>

<head >
  <title>ASP.NET XHTML Page</title>
</head>

<body>
  <form id="Form1" >
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox  id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label  id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button  id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script >
void Button1_Click(Object sender, EventArgs e)
{
    Label1.Text = "Built at " + DateTime.Now.ToString();
}
void listFruit_SelectedIndexChanged(Object sender, EventArgs e)
{
    Label1.Text = "You selected " + listFruit.SelectedItem.Text;
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
  <title>ASP.NET XHTML Page</title>
</head>
<body>
  <form id="Form1" >
    <div>
      <h1>ASP.NET Sample Page for XHTML</h1>
      <p>
      <asp:listbox  id="listFruit" AutoPostBack="true" 
          onselectedindexchanged="listFruit_SelectedIndexChanged">
         <asp:listitem>Apple</asp:listitem>
         <asp:listitem>Banana</asp:listitem>
         <asp:listitem>Orange</asp:listitem>
      </asp:listbox>
      </p>
      <asp:label  id="Label1" ForeColor="white" 
          BackColor="black" />
      <br />
      <asp:button  id="Button1" onclick="Button1_Click" 
          Text="Click me"/>
    </div>
  </form>
</body>
</html>

다음 사항을 참고하십시오.

  • 페이지가 렌더링되면 action 특성이 추가되므로 form 요소에 action 특성이 포함되지 않습니다.

  • Label 컨트롤의 서식 속성이 style 특성으로 렌더링됩니다.

  • 서버 스크립트를 포함하는 script 요소가 브라우저에 렌더링되지 않으므로 type 특성이 필요하지 않습니다.

  • 페이지에서는 ListBox 컨트롤의 자동 다시 게시 동작을 사용하기 위해 런타임에 클라이언트 스크립트를 렌더링하지만 XHTML과 호환되는 방식으로 스크립트를 렌더링합니다.

XHTML 규칙을 준수하는 정적 텍스트 및 HTML 요소

ASP.NET에서는 페이지에 추가되는 정적 텍스트 또는 비서버 HTML 요소를 변경하지 않습니다. 예를 들어 ASP.NET 웹 페이지에 TextBox 및 Button 컨트롤과 <p></p> 태그 내에 추가하는 정적 텍스트가 포함될 수 있습니다. ASP.NET에서는 TextBox 및 Button 컨트롤에 대해 XHTML을 렌더링할 수 있지만 <p></p> 태그 사이에서 발생하는 XHTML 오류를 수정할 수 없습니다. 정적 텍스트 또는 HTML 요소를 만들 경우에는 XHTML 규칙을 준수해야 합니다. 다음 단원에서 설명하는 대로 유효성 검사를 수행하여 페이지를 확인할 수 있습니다.

HTML 컨트롤의 알 수 없는 특성은 렌더링된 컨트롤 출력으로 전달되고 올바른 XHTML 태그로 유효성 검사되지 않습니다. 예를 들어, HtmlHead 컨트롤에 대해 ID 특성을 지정하면 XHTML 1.0 Strict 호환되지 않는 태그가 생성됩니다. 태그의 유효성을 검사하려면 W3C(World Wide Web 컨소시엄) Validation Markup Service 같은 태그 유효성 검사기를 사용해야 합니다.

ASP.NET 웹 페이지의 XHTML 준수 검사

ASP.NET 웹 페이지를 만든 후에는 각 페이지에서 올바른 XHTML을 렌더링하는지 확인할 수 있습니다. ASP.NET 웹 서버 컨트롤은 페이지가 실행되는 경우에만 XHTML을 렌더링하므로 이러한 컨트롤이 페이지에 포함된 경우에는 페이지 작성 중에 해당 페이지를 확인할 수 없습니다.

참고:

Visual Studio와 같은 일부 비주얼 디자이너에서는 디자인 타임에 페이지 태그의 XHTML 유효성을 검사할 수 있습니다.

페이지에 대해 XHTML의 유효성을 검사하려면 페이지를 실행하고 결과를 확인하는 서비스를 사용해야 합니다. 일반적으로 이 작업을 수행하려면 공개적으로 사용 가능한 서버에 페이지를 배포합니다. 이 서버는 테스트 서버일 수 있으며 프로덕션 서버일 필요는 없습니다. 그러나 인터넷에 연결되어 있어야 합니다. 그런 다음 프로그래밍 방식으로 페이지를 읽을 수 있는 유효성 검사 서비스를 사용할 수 있습니다.

일반적으로는 World Wide Web Consortium에서 관리하는 W3C Markup Validation Service가 사용됩니다. 이 유효성 검사기를 사용하려면 유효성 검사 서비스로 검사할 페이지의 URL을 입력합니다. 그러면 유효성 검사 사이트에서 페이지를 요청하고 오류 보고서를 만듭니다. 또는 웹 페이지의 소스를 저장하여 유효성 검사 서비스에 파일 형식으로 제출할 수도 있습니다. 이 유효성 검사 서비스에 대한 자세한 내용은 W3C 웹 사이트를 참조하십시오.

검사할 페이지에 동적 콘텐츠가 포함되어 있거나 사용자가 사이트에서 웹 페이지를 사용자 지정할 수 있는 경우, 페이지에 포함될 수 있는 모든 콘텐츠가 유효하도록 다양한 콘텐츠로 페이지를 테스트해야 합니다. 그러나 경우에 따라 페이지에 출력될 수 있는 콘텐츠가 너무 다양해서 효과적으로 테스트하기가 어려울 수 있습니다.

태그 유효성 검사를 위한 브라우저 기능 구성

페이지를 처리할 때 ASP.NET에서는 요청에서 현재 브라우저에 관한 정보를 확인하고 브라우저 형식(사용자 에이전트 문자열)에 따라 브라우저에 적합한 태그를 렌더링합니다. 자세한 내용은 ASP.NET 웹 서버 컨트롤 및 브라우저 기능을 참조하십시오.

ASP.NET 웹 페이지를 W3C Markup Validation Service와 같은 유효성 검사 서비스에 제출하면 ASP.NET에서 XHTML 표준에 맞지 않는 버전의 페이지를 렌더링할 수 있습니다. 그 이유는 유효성 검사기 서비스가 자신을 ASP.NET에서 인식할 수 있는 Internet Explorer나 Mozilla 같은 브라우저 형식으로 보고하지 않기 때문입니다. ASP.NET에서는 브라우저 형식을 인식할 수 없으면 기본적으로 하위 태그를 렌더링하며, 이 경우 XHTML 호환 요소 및 특성 또는 CSS 스타일시트와 같은 기능이 포함되지 않습니다.

XHTML 표준에 맞는 올바른 태그를 유효성 검사 서비스로 보내도록 응용 프로그램을 구성하려면 유효성 검사 서비스의 사용자 에이전트 문자열에 대한 브라우저 정의를 만들면 됩니다. 예를 들어, W3C Markup Validation Service에서는 "W3C_Validator"로 시작하는 사용자 에이전트를 보고합니다. W3C 유효성 검사기에 대한 브라우저 정의를 만들려면 응용 프로그램의 App_Browsers 폴더에 .browser 파일(파일 이름은 원하는 대로 지정)을 만든 후 다음 browsers 요소를 추가합니다.

<browsers>
  <browser id="W3C_Validator" parentID="default">
    <identification>
        <userAgent match="^W3C_Validator" />
    </identification>
    <capabilities>
      <capability name="browser"              value="W3C Validator" />
      <capability name="ecmaScriptVersion"    value="1.2" />
      <capability name="javascript"           value="true" />
      <capability name="supportsCss"          value="true" />
      <capability name="tables"               value="true" />
      <capability name="tagWriter" 
         value="System.Web.UI.HtmlTextWriter" />
      <capability name="w3cdomversion"        value="1.0" />
    </capabilities>
  </browser>
</browsers>

브라우저 정의 만들기에 대한 자세한 내용은 브라우저 정의 파일 스키마(browsers 요소)를 참조하십시오.

XHTML 준수 예외

ASP.NET에서는 XHTML 규칙을 준수하는 태그를 생성하지만 일부 컨트롤에서 지원하는 추가 기능을 사용하면 XHTML과 호환되지 않는 태그가 생성될 수 있습니다.

참고:

각 컨트롤은 고유 태그를 렌더링합니다. 타사에서 만든 사용자 지정 컨트롤은 XHTML 규칙을 준수하는 결과를 출력하도록 작성되지 않을 수도 있습니다. 사용자 지정 컨트롤을 사용할 경우에는 컨트롤 공급업체에 문의하여 해당 컨트롤에서 지원하는 표준을 확인해야 합니다.

target 특성

호환되지 않는 태그를 생성할 가능성이 있는 컨트롤의 예로는 target 특성을 포함시켜 클라이언트측 동작을 지정할 수 있는 컨트롤이 있습니다.

해당 target 특성이 설정된 컨트롤을 포함하는 페이지는 XHTML 1.1에 대해 유효성이 검사되지 않습니다. XHTML 1.1 표준을 완벽하게 준수하는 페이지를 만들어야 하는 경우에는 target 특성과 같은 옵션을 사용하지 않아야 합니다. 이러한 옵션을 사용하는 경우 표준에 맞지 않는 태그가 생성됩니다.

select 요소

DropDownList 또는 ListBox 컨트롤을 사용하여 하나 또는 여러 항목을 선택할 수 있습니다. DropDownListListBox 컨트롤은 각각 HTML select 요소를 렌더링합니다. DropDownList 또는 ListBox 컨트롤에 적어도 하나의 ListItem 컨트롤이 포함되지 않으면 렌더링된 select 요소에 자식 option 요소가 없게 되므로 XHTML 1.1에 대한 유효성이 사라집니다.

참고 항목

작업

방법: ASP.NET 웹 사이트에서 XHTML 렌더링 구성