2011-11-12 7 views
2

발췌문 1 :왜이 두 코드 스 니펫의 출력간에 차이가 있습니까?

<% _message.InnerText = this.GetType().ToString(); %> 
<h3>Page type: <span id=_message runat=server/></h3> 

코드 조각 2 :

<h3>Page type: <span id=_message runat=server/></h3> 
<% _message.InnerText = this.GetType().ToString(); %> 

1은 나에게 예상되는 출력을 제공하지만이 나에게 아무것도주지 않는다.

왜?

+3

스 니펫 2에서 스팬이 이미 렌더링되었으므로 해당 컨트롤에 대한 모든 변경 사항이 다음 포스트 백에만 적용되는 반면 스 니펫 1에서는 그 반대로 적용됩니다. –

답변

0

Linus가 말했듯이 "f *** 소스 코드 읽기." 그래서, 거기이 핵심 포인트 2.

// ASP.default_aspx 
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    __w.Write("\r\n "); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n start\r\n  "); 
    this._message.InnerText = base.GetType().ToString(); 
    __w.Write("\r\n  <h3>Page type:"); 
    parameterContainer.Controls[1].RenderControl(__w); // Here the change has no effect. 
    __w.Write("</h3>\r\n end\r\n "); 
} 

에 대한

1.

// ASP.default_aspx 
private void __Renderform1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    __w.Write("\r\n "); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n start\r\n  <h3>Page type:"); 
    parameterContainer.Controls[1].RenderControl(__w); 
    __w.Write("</h3>\r\n  "); 
    this._message.InnerText = base.GetType().ToString(); 
    __w.Write("\r\n end\r\n "); 
} 

에 대한 :

  1. 을 그래서 나는 코드를 컴파일이 있어요 ASP.NET 파서는 전체 페이지를 위에서 아래로 패션,로 렌더링합니다. 문자 그대로 입니다.

  2. 혼란은 데스크탑에서의 내 경험에 기인합니다. . 데스크톱 앱의

, 그것은 같은있다 : -> Memeory - 코드 ASP.NET 응용 프로그램의 경우> UI

,이 같은입니다 : 코드 -> 메모리 -> OUPUT Buffer-> UI

에서 스 니펫 2, 코드 -> 메모리 단계에 대한 변경이 발생하지만 출력 버퍼에 적용 할 기회가 없으므로 궁극적 인 UI에서는 변경된 사항이 없습니다.

근본적인 원인은 ASP.NET 응용 프로그램 용 UI에 도달하기 전에 추가 단계가 있다는 것입니다.

나는 분명히 할 수 있기를 바랍니다.

+0

게시물을 수정하고 답변을 시도하십시오. 귀하의 질문에 답변을 업데이트하지 마십시오. – bharath

+0

상기시켜 줘서 고마워. 끝났다. – smwikipedia

1

코멘트에서 누군가가 지적했듯이 코드가 실행되기 전에 span 태그가 이미 렌더링되어 브라우저에 전달 되었기 때문입니다. 그러나 Response.Buffer 플래그를 true로 설정하면 둘 다 동일하게 동작합니다. (상황이 당신이 시작하지 않도록해야 하나이기 때문에 난 그냥 여기 추측하고있어 내가 이것을 테스트하지 않았습니다.).

<% Response.Buffer = true; %> 

: 페이지의 상단에 코드 줄을 넣어 흥미롭게도 필자는 시연이 인라인 코드가 왜 나쁜 생각인지를 보여주는 많은 좋은 예 중 하나라고 생각합니다. 궁극적으로 웹 서버와 웹 브라우저의 작동 방식과 잘 맞지 않는 접근 방식입니다.

+0

감사합니다. Response.Buffer = true로 설정하려고했습니다. 작동 안함. – smwikipedia

+0

Responser.Buffer는 완전한 응답이 준비 될 때까지 출력을 버퍼링하는 것을 결정합니다.페이지 컨트롤의 렌더링 순서와는 관련이 없습니다. – smwikipedia

관련 문제