2010-05-28 2 views
0

예를 들어 gridview itemtemplate에서 사용할 수있는 usercontrol이 있습니다. 즉, 컨트롤이 페이지로드시 페이지에 있거나 없을 수 있습니다. 컨트롤이 itemtemplate 안에있는 경우 비동기 포스트 백을 통해 gridview를 popup합니다 (updatepanels를 통해).ScriptManager는 javascript를 복제합니다.

javascript에 따라 컨트롤 자체가 registrers 스크립트 블록이됩니다. 첫째 그래서 난 다음 시도 내가

Page.ClientScript.RegistrerClientScriptBlock 

을 사용하지만이 비동기 포스트 백 (updatepanels)에서 작동하지 않습니다 같은 날 비동기 포스트 백 후 페이지에 스크립트를 registrer 할 수 있도록 스크립트 관리자를 사용하여. 큰!.

ScriptManager.RegisterClientScriptBlock 

그러나, 스크립트 관리자는 (내가 알고있는 것) 스크립트가 이미 페이지에 있는지 확인하기 위해 functionallity을이없는, 그래서 모든 포스트 백에 대해 스크립트 블록의 중복을 생성합니다, 이것은 당연히 원치 않는 행동이다 .

Google에서 실행 한 결과 PageRequestManager의 Dispose() 메소드를 호출 할 수 있음을 발견했습니다. 스크립트를 지우고 다시 추가하기 때문에 작동합니다 (사용하지 않은 상태로 제거 할 때도 문제가 해결됨). 제거 된 컨트롤의 스크립트 블록).

Sys.WebForms.PageRequestManager.getInstance().Dispose() 

그러나 여기에 게시 한 이후로 단점이 있습니다. :) Dispose() 메서드는 인스턴스를 마스터 페이지에 배치하므로 거기에서 실행되는 스크립트로 연결되는 비동기 포스트 백 (예 : updateprogress)이 작동을 멈 춥니 다.

그래서 ScriptManager 또는 다른 도구를 사용하여 페이지에 스크립트가 이미 존재하는지 확인하여 중복 스크립트를 삽입하지 못하도록 할 수 있습니까? 또한 특정 스크립트 블록을 제거하는 방법이 있습니까 (예 : itemtemplate에서 항목을 제거 할 때).

미리 감사드립니다.

답변

0

등록 할 때 동일한 유형 및 키 속성을 설정하면 SM에 다음 중 하나만 포함됩니다.

+0

흠, 그것은 실제로 보인다. 내가 그것을 파고 들었을 때 나는 실수로 번호 하나였던 스크립트를 등록하기 위해 usercontrol 대신에 Page를 사용한다는 것을 실제로 깨달았다. 실수 2 번은 비동기 포스트 백을 처리하는 내 인텐션 스크립트에 add_endRequest를 포함 시켰지만, ScripManager가 나를 위해이 스크립트를 수행하는 것처럼 보이기 때문에 필요하지 않습니다. 따라서 중복 호출이 발생합니다. 답변 주셔서 감사합니다 :) – Andreas

1

함수 이와 같은 시도 : 당신이 올바른지처럼

Public Sub AddScriptToCompositeScriptSafety(ByRef manager As ScriptManager, ByRef script As ScriptReference) 

    For Each item In manager.CompositeScript.Scripts 
     If (item.Path = script.Path) Then 
      Return 
     End If 
    Next 
    manager.CompositeScript.Scripts.Add(script) 

End Sub 
관련 문제