2

jquery 플러그인에 전적으로 의존하는 사용자 정의 컨트롤이 있습니다. 모든 것이 정상적으로 작동하지만 컨트롤이 Visible = false로 설정되거나 해당 부모 중 하나가 Visible로 설정되지 않은 경우 문제가 발생합니다. 이상 적으로, asp.net 컨트롤이 Visible false로 설정되면 엔진이 렌더링하지 않아 내 컨트롤이 페이지로드에서 렌더링되지 않습니다. 그리고 컨트롤이 렌더링되지 않으면 javascript 리소스가로드되지 않으므로 컨트롤이 포스트 백에 나타날 때 jquery 플러그인이 바인딩되지 않습니다. 이것은 매우 기본적인 문제이며, 개발자가 사용하기로되어있는 개발자는 완벽하게 작동한다고 가정하고 컨트롤을 페이지에 끌어서 놓기 만합니다. 나는 그것을 위해 해결해야 할 것 같아요. 아래에 붙여 넣은 리소스를로드하는 방법입니다.사용자 정의 컨트롤 : 페이지로드시 컨트롤이 숨겨져있을 때 스크립트가로드되지 않습니다.

ClientScriptManager cs = this.Page.ClientScript; 

#region Loading JavaScript File(s) 
string MenuPlugin = "MainMenuControl.Scripts.javascript_main.js"; 
cs.RegisterClientScriptResource(typeof(MainMenuControl.MenuControl), MenuPlugin); 
string MenuInitializer = "MainMenuControl.Scripts.BuildMenu.js"; 
cs.RegisterClientScriptResource(typeof(MainMenuControl.MenuControl), MenuInitializer); 
#endregion 

#region Loading CSS File(s) 
string cssUrl = Page.ClientScript.GetWebResourceUrl(this.GetType(), "MainMenuControl.Styles.MenuStyle.css"); 
HtmlLink cssLink = new HtmlLink(); 
cssLink.Href = cssUrl; 
cssLink.Attributes.Add("rel", "stylesheet"); 
cssLink.Attributes.Add("type", "text/css"); 
this.Page.Header.Controls.Add(cssLink); 
#endregion 

#region Loading Image(s) 
Page.ClientScript.GetWebResourceUrl(typeof(MainMenuControl.MenuControl), "MainMenuControl.Images.down.gif"); 
string script = string.Format(@"initializeMenu('{0}');", Page.ClientScript.GetWebResourceUrl(typeof(MainMenuControl.MenuControl), "MainMenuControl.Images.down.gif")); 
Page.ClientScript.RegisterStartupScript(Page.GetType(), "InitImage", script, true); 
#endregion 

코드의 세 번째 마지막 줄에는 이미지 URL이 올바르게로드 된 함수가 호출됩니다. 그러나 어떤 이유로 든 자바 스크립트 파일은로드되지 않으며 브라우저는로드 된 리소스 목록에 표시하지 않습니다.

문제에 대한 해결책이 있습니까? 아니면 제가 잘못하고있는 것이 있습니까? 나는 지금이 문제에 대해 정말로 무력하고 도움을 주시면 감사하겠습니다.

답변

1

이전에 매우 비슷한 문제가 있었으며 귀하의 질문을 알게되었습니다.

OnPreRender 메서드를 재정 의하여 사용자 정의 컨트롤에 대한 javascript를로드하고있었습니다. 일반 페이지 환경에서 컨트롤을 사용할 때

protected override void OnPreRender(EventArgs e) { 
     base.OnPreRender(e); 
     Page.ClientScript.RegisterClientScriptInclude("MyJavascript", "MyURL"); 
    } 

는 일을했지만,이 경우에 나는 그것을 숨기고 처음 업데이트 패널 내부에 그것을 사용 하였다. 업데이트 패널에서 Ajax 포스트 백을 입력하면 Visible 속성이 true로 업데이트됩니다. 이 시점에서 ASP.NET은 클라이언트 스크립트를 페이지의 <head>에 자동 삽입 할 기회가 없습니다.

당신이 Page 이벤트 중 하나에 이벤트 처리기를 추가 할 수 있습니다이 시점에서 (항상 컨트롤이 숨겨진 경우에도 해고해야하는) OnInit을 무시할 수

대신의 최우선 OnPreRender 솔루션. 이렇게하면 Page 수명주기의 일부로 항상 실행되는 OnPreRender 메서드를 자유롭게 추가 할 수 있습니다.

protected override void OnInit(EventArgs e) { 
     base.OnInit(e); 

     Page.PreRender += new EventHandler(Page_PreRender); 
    } 

    protected void Page_PreRender(object sender, EventArgs e) { 
     Page.ClientScript.RegisterClientScriptInclude("MyJavascript", "MyURL"); 
    } 
+0

답장을 보내 주셔서 감사합니다. 이 문제는 아직 해결되지 않았으며, 언젠가는 지금 시도 할 것입니다. –

관련 문제