2012-06-06 3 views
2

그래픽을 표시 한 다음 사용자가 그래픽 아래에 설명을 입력 할 수 있도록 웹 페이지를 만들었습니다. 사용자가 입력하라는 메시지가 나타나고 목록에 각 주석을 저장하고 목록을 정렬 된 HTML 목록으로 표시하려고합니다.Visual Web Developer 새 HTML로 내부 HTML 바꾸기

<script runat="server"> 

private List<string> messages = new List<string>(); 

protected void Button2_Click(object sender, EventArgs e) 
{ 
    messages.Add(TextBox2.Text); 
    TextBox2.Text = ""; 
} 

protected void Button3_Click(object sender, EventArgs e) 
{ 
    messages.Clear(); 
} 

protected void Button4_Click(object sender, EventArgs e) 
{ 
    string output = "<ol>"; 
    foreach (string message in messages) 
    { 
     output += "<li>"; 
     output += message; 
     output += "</li>"; 
    } 
    output += "</ol>"; 
    Message.InnerHtml = Server.HtmlEncode(output); 
} 

protected void Chart1_Load(object sender, EventArgs e) 
{ 

} 

</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     Key Messages:<br /> 
     <span id="Message" runat="server"> 
      <asp:TextBox runat="server" ID="TextBox2" Width="500px"></asp:TextBox> 
      <asp:Button runat="server" ID="Button2" Text="Enter Message" Onclick="Button2_Click" /> 
      <asp:Button runat="server" ID="Button3" Text="Clear Messages" onclick="Button3_Click" /> 
      <asp:Button runat="server" ID="Button4" Text="Done" onclick="Button4_Click" /> 
     </span> 
    </div> 
    </form> 
</body> 
</html> 

이의 출력은 다음과 같습니다 :

1) 당사 텍스트가있는 텍스트 상자에 입력되지 않는 :

Key Messages: 
<ol></ol> 

그래서 내가이 비밀이 여기에 관련 코드입니다 목록에 추가

2) 새로운 HTML이 일반 텍스트로 표시되는 이유는 무엇입니까?

모든 조언을 주시면 감사하겠습니다.

감사합니다.

답변

1

1) 목록

에 추가되는 것을 수정해야합니다, 당신은 사이의 데이터를 지속되지 않습니다 요청.
버튼을 클릭하면 전체 페이지가 다시 인스턴스화되어 message 변수가 다시 설정됩니다.

Session이 사용될 수있다. 예를 들어이 같은 속성으로 message 필드를 대체 :

private List<string> Messages 
{ 
    get 
    { 
     var messages = Session["Messages"] as List<string>; 

     if (messages == null) 
     { 
      messages = new List<string>(); 
      Session["Messages"] = messages; 
     } 

     return messages; 
    } 
} 

2) 왜 일반 텍스트로 표시되는 새로운 HTML입니다.

당신은 당신의 output을 인코딩하는

(A <span> 내부 측면 노트에 <ol> 태그는 렌더링하더라도, 잘못된 HTML)입니다.
는 단순히 이런 식으로 인코딩하지 원하는 결과를 얻으려면 :

(나는 이것에 확실히 100 % 모르겠지만 라이브 시스템 IIS 수도 자동 인코딩 문자열에 IIS를 실행하는 경우 내 생각 그런 경우 인 경우 다시 같은 문제가 대안으로 제시 BulletList 봐.)

protected void Button4_Click(object sender, EventArgs e) 
{ 
    string output = "<ol>"; 
    foreach (string message in Messages) 
    { 
     output += "<li>"; 
     output += message; 
     output += "</li>"; 
    } 
    output += "</ol>"; 
    Message.InnerHtml = output; 
} 

대안은 동일한 결과를 얻을 수있는 BulletStyleNumbered의를 사용하여 BulletList를 사용하는 것입니다.
당신의 Html이 같은 업데이트 :이에 Button4_Click의 코드

<div> 
    Key Messages:<br /> 
    <span id="Message" runat="server"> 
     <asp:TextBox runat="server" ID="TextBox2" Width="500px"></asp:TextBox> 
     <asp:Button runat="server" ID="Button2" Text="Enter Message" OnClick="Button2_Click" /> 
     <asp:Button runat="server" ID="Button3" Text="Clear Messages" OnClick="Button3_Click" /> 
     <asp:Button runat="server" ID="Button4" Text="Done" OnClick="Button4_Click" /> 
    </span> 

    <asp:BulletedList BulletStyle="Numbered" ID="OutputMessages" runat="server"> 
    </asp:BulletedList> 
</div> 

변경 :

protected void Button4_Click(object sender, EventArgs e) 
{ 
    // If you want to hide the message controls. 
    Message.Visible = false; 

    foreach (var message in Messages) 
    { 
     OutputMessages.Items.Add(new ListItem(Server.HtmlEncode(message))); 
    } 
} 

요약

  • 이 예제 Session
  • 에 사용, 데이터를 지속
  • 당신이 HTML을 원하는 경우는
  • BulletList를 사용하는 대신 <span> 내부의 <ol> 태그는 잘못된 HTML
  • 입니다
  • HTML의 안전하지 않은 문자열을 다시 전송 고려 렌더링하기 위해 통과 (아래 경고 읽기) 데이터를 인코딩하지 마십시오 이 악성 스크립트를 보낼 수있을 것이다 아래로 서버에서 오는 데이터를 인코딩하지 않을 경우

인코딩

경고. 예를 들어 다음을 수행한다고 가정 해보십시오.

Message.InnerHtml = "<script>alert('Hello');</script>"; 

위의 코드는 경고를 표시하는 스크립트를 실행합니다. 이것이 악성 스크립트라고 상상해보십시오!

그러나 위에서 설명한 것처럼 IIS는이 스크립트가 실행되지 않지만 일반 텍스트로 렌더링되어야하는 경우 문자열을 자동 인코딩 할 수 있습니다.

0

웹 페이지의 작동 방식을 이해해야합니다. 단추/하이퍼 링크를 클릭 할 때마다 새 http 요청이 만들어지고 프로세스에서 새 페이지가 검색됩니다 (아약스를 사용하지 않는 한 처리 할 다른 문제입니다).

List 유형의 전용 변수를 설정할 수는 있지만 현재 페이지 인스턴스에만 해당됩니다. 사용자가 요청 (예 : 버튼 클릭)하면 페이지의 새 인스턴스가 생성되어 사용자에게 반환됩니다.> 목록은 항상 비어 있습니다. HTTP는 상태 비 저장이므로 요청간에 데이터 지속성을 수행하는 방법이 필요합니다.

목록이 사용자에 특정한 경우 ViewState 또는 SessionState를 사용하여 필요에 따라 데이터를 저장/검색 할 수 있습니다. 좀 더 글로벌 한 것이라면 데이터베이스/파일을 영속성 매체로 사용하십시오.

+0

틀린 장소. 이것을 무시하십시오. – Quintium

0

List는 정적이 아니므로 페이지가 요청 될 때마다 재정의됩니다.

재생 텍스트로 표시되는 이유는 출력을 Html로 인코딩하기 때문입니다. 따라서 < 및> 문자의 HTML 표현이됩니다 (& lt 및 & gt;).

Message.InnerHtml = output; 

다른 사람에 의해 언급 한 바와 같이 왜 텍스트가 텍스트 상자에 입력되지 않는

+0

'정적'문제는 응용 프로그램이 광범위하다는 것입니다. 심지어'private static readonly List Messages = new List ();을'static'으로 변경하고'Firefox'와'Chrome' (예 : IE와 다른 프로그램)을 엽니 다. 하나의 브라우저를 사용하여 메시지를 추가 한 다음 다른 쪽에서 '완료'를 클릭하여 목록을 가져올 수 있습니다. 나는 "정적"을 사용하고 응용 프로그램 전체에 메시지를 공유하는 것이 좋은 방법이라고 생각하지 않는다. – Nope

+0

"정적"키워드를 실제로 언급하지는 않았지만 매번 페이지가 요청 될 때 개체가 정적이지 않은 방법. 거기 혼란에 관하여 유감스럽게 생각합니다. – Quintium