2011-03-08 1 views
1

이 같은 첫 페이지로드에 클라이언트 스크립트 블록을 추가하고 경우포스트 백에 클라이언트 스크립트를 다시 등록해야합니까?

if (this.Page.IsPostBack==false) 
      { 
       if (this.Page.ClientScript 
          .IsClientScriptIncludeRegistered("ctlmyControl")==false) 
       { 
        string guidParamToHackBrowserCaching 
            = System.Guid.NewGuid().ToString(); 

this.Page.ClientScript.RegisterClientScriptInclude("ctlmyControl" 
         , ResolveUrl(String 
          .Format("~/clientScripts/ctlmyControl.js 
         ?par={0}",guidParamToHackBrowserCaching))); 
       } 
      } 

내가 모든 포스트 뒤에를 다시 등록 해야합니까?

감사합니다, 그것은 스크립트가하지만, 아마에 따라 달라집니다

답변

2

스크립트가 상주하는 페이지의 실제 부분이 다시 게시 된 후 다시 렌더링 된 경우 예입니다. 그렇지 않다면, 아니오, 그리고 실제로, 이 아니어야하며 중복 될 수도 있습니다. 이 부분 포스트 백을 사용하는 페이지 및 스크립트를 등록 UpdatePanel 요구를 렌더링하는 코드를 사용하는 경우

더 구체적으로, 당신은 첫 번째 페이지로드를 제외하고 그것을 다시 등록하지 않아야합니다. 반면, 페이지가 전체 포스트 백 또는 초기 페이지로드에서로드 된 경우 이어야합니다. ScriptManager은 부분 포스트 백에서 UpdatePanel의 동적 내용 영역 외부에 스크립트를 삽입하지만 이전 포스트 백에서 렌더링되었을 수있는 기존 스크립트는 고려하지 않습니다. (실제로는 그렇지만 실제로는 그렇습니다.)

스크립트가 어떤 방식 으로든 영속화되지 않는다면 클라이언트에 여전히 존재하는 정도를 제외하면 길고 짧습니다. 페이지의 일부가 다시로드되지 않았습니다. 그리고 ScriptManager은 페이지의 정적 부분에 이미 렌더링 된 것을 기억하지 않으려 고합니다. 따라서 스크립트가 렌더링 될 실제 장소가 포스트 백 (비동기 또는 전체 일 수 있음)에서 업데이트되면 스크립트를 다시 등록해야합니다. 그렇지 않은 경우 스크립트를 다시 등록해야합니다.

0

. 다시 게시하면 스크립트를 포함하여 브라우저의 이전 DOM이 파괴되고 새로운 페이지 인스턴스로 작업하게됩니다. 여전히 페이지의 일부로 이것을 필요로한다면 여전히 등록되어 있는지 확인해야합니다.

대체 방법은 스크립트를보다 정적으로 리팩터링하여 필요한 제어 값이 매개 변수가 함수에 전달되도록하는 것입니다. 그런 다음 일반 <script 태그를 사용할 수 있으며 각 포스트 백에서 수행해야하는 유일한 작업은 함수를 호출 할 때 사용할 수있는 변수에 컨트롤의 ID를 쓰는 것입니다.

+0

server -partial postback에 대한 비동기 호출 인 경우 스크립트가 브라우저 캐시에 남아 있다고 생각합니다. 옳은? – pencilCake

+1

@burak - 예, 부분 포스트 백의 경우 브라우저의 DOM이 파괴되지 않으므로 스크립트가 클라이언트에 계속 남아 있습니다. –

+0

.. 실제로 스크립트가 업데이트 된 페이지 부분에 렌더링되지 않은 경우. 'RegisterStartupScript'를 사용하면'UpdatePanel' 영역에있게 될 것이고, 그렇지 않은 경우에는 안됩니다. 그래서 부분적인 포스트 백 이후에 시작 스크립트를 다시 등록하기를 원할 것입니다. (그런 부분이 실제로는 부분적인 포스트 백 이후에 실행되기 때문에 실제로 구분됩니다.) –