2012-09-14 2 views
1

저는 이것이 비현실적 인 것처럼 보입니다.하지만 저는이 WebForms 페이지를 어떻게 재구성하여 긴급하고 막판의 비즈니스 요구 사항을 충족시킬 수 있는지에 따라이 방법을 선호합니다.ASP.NET WebForms : Javascript를 보이지 않는 상태로 액세스하는 방법, UpdatePanel을 통해 보이게 한 후에 렌더링하는 방법?

사용자 정의 컨트롤이 있습니다. 이 usercontrol에는 다양한 컨트롤 'onclickonchange 이벤트까지 연결된 함수가 포함 된 Javascript 블록이 있습니다. 이전에는 컨트롤의 .Visible 속성이 True 이었으므로 해당 HTML과 자바 스크립트가 페이지에 렌더링됩니다.

이제 내 컨트롤의 .Visible 속성을 false으로 설정하고 주위에 UpdatePanel을 래핑해야합니다. 이렇게하면 초기 페이지가로드되는 동안 컨트롤의 HTML이 렌더링되지 않습니다. 컨트롤의 내용을 표시하려면 사용자가 컨트롤의 .Visible 속성을 true으로 설정하는 서버 측 메서드를 누르는 버튼을 클릭해야합니다. 이제 UpdatePanel에 있기 때문에 컨트롤은 Ajaxy 방식으로 페이지에 나타납니다. 그러나 컨트롤에있는 자바 스크립트에 액세스 할 수 없으므로 자식 컨트롤 'onclickonchange 이벤트는 연관 자바 함수가 undefined이기 때문에 작동하지 않습니다.

  • JSON/AJAX (예 : 짧은 시간에 관여 너무 많은 아키텍처 재구성)
  • CSS 표시 : 간결하게하기 위해에 갈 너무 복잡 이유로 활용하는 내가하지 않으려는

    솔루션 : none/visibility : visible (재구성을 최소화 할 수있는만큼 서버 측 기능을 유지해야 함)

  • 부모 페이지 또는 .js 파일에 Javascript를 넣으십시오 (최후의 수단으로 생각 하겠지만 서버를 참조합니다. <#%=ControlId.ClientID %>을 사용하여 제어합니다 .Javascript가 UserCo에 포함되어 있지 않으면이 작업을 수행 할 수 없습니다. ntrol 내가 컨트롤 'ClientIdModestatic로 설정하지 않습니다.)

내가 정말 클라이언트에 액세스 할 수있는 방법으로 내 UserControl을에서 자바 스크립트를 유지하는 방법을 찾으려면 UpdatePanel은 UpdatePanel을 사용하여 컨트롤의 .Visible 속성을 true으로 설정할 때 발생합니다.

+0

혹시이에 대한 해결책을 마련 했습니까? 나는 똑같은 문제를 겪고있다. –

답변

2

뒤에 코드에서 큰 문자열로 자바 스크립트를 포함하고 부하에 등록하는 것입니다 그렇게하는 가장 쉬운 방법이 더가 없습니다

 protected void Page_Load(object sender, EventArgs e) 
     { 
      string javasriptToRegister = @" 
    function MyAwesomeJavaScriptFunction() { 
    alert(document.getElementById('" + this.txtCatName.ClientID + @"').value); 
    }"; 
      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true); 
     } 

이 완료 얻을 수있는 가장 깨끗한 방법을 의미한다, 그러나 그것은 효과가있을 것이다.

조금 더 깨끗하게하려면 싱글 톤 또는 컨트롤을 나타내는 프로토 타입 객체 (예 : 사용 사례에 따라 다름)가있는 외부 자바 스크립트 파일을 포함 할 수 있습니다. 그런 다음 위에 나온 것처럼 작은 스크립트에 클라이언트 ID의 개체/싱글 톤 속성을 설정할 수 있습니다.

자바 스크립트 :

function MyControlScriptModel() { 
    this.txtCatNameClientId = ''; 
    this.othercontainedValue = 0; 
    this.anothercontainedValue = 0; 
} 

MyControlScriptModel.prototype.DoSomethingWithCatName = function() { 
    alert(document.getElementById(this.txtCatNameClientId).value); 
} 

코드 뒤에 예를 들어

 protected void Page_Load(object sender, EventArgs e) 
     { 
      string javasriptToRegister = string.Format(@"var obj = new MyControlScriptModel(); 
                 obj.txtCatNameClientId = '{0}';", this.txtCatNameClientId); 
      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "MyControlsJavaScript", javasriptToRegister, true); 
     }