2009-12-30 4 views
1

Page_Load 이벤트의 마스터 페이지 및 사용자 컨트롤 뒤에있는 코드에 js 및 css를 포함하려고합니다.asp.net의 마스터 페이지 및 사용자 정의 컨트롤에 자바 스크립트 및 CSS 포함하기

하지만 사용자 컨트롤의 Page_Load가 마스터 페이지의 Page_Load보다 먼저로드되기 때문에 js가 깨졌습니다. 사이트 전체에서 내 마스터 페이지에 사용되는 jquery 라이브러리를 포함하지만 사용자 정의 컨트롤에 사용되는 스크립트는 사용자 정의 컨트롤에만 포함됩니다. 문제는 사용자 컨트롤 js 스크립트가 jquery 기능을 사용한다는 것입니다 (실행해야 할 때). 그러나 실행하려고하면 jquery 라이브러리가 아직로드되지 않아 중단됩니다. Anwyays,이 초조 한 혼란을 피할 방법이 있을까요?

나는이 코드를 사용하여 내 코드에 js를 포함시킵니다. relativeResolvedPath 기본적 때 ResolveUrl (URL)

HtmlGenericControl js = new HtmlGenericControl("script"); 
    js.Attributes.Add("type", "text/javascript"); 
    js.Attributes.Add("src", relativeResolvedPath); 
    Page.Header.Controls.Add(js); 

답변

0

마스터 페이지에서 Page_Init을 사용하면 자식 페이지 및 UserControl Page_Load 이벤트보다 먼저 코드를 실행할 수 있습니다.

간혹 "소스보기"를 온전하게 수행하는 것을 잊지 마세요. 당신은 물건들이 당신이 기대하는 순서대로 응답에 들어가는 지 확인해야합니다.

UserControls에서 사용되는 클라이언트 스크립트는 응답이 사용자 에이전트에 전송 될 때까지 실행되지 않으므로 jQuery 라이브러리가 응답의 앞부분에 포함되어 있으면 확인해야합니다. 보내는 클라이언트 코드와 서버 코드가 섞여 있지 않으면 실제로는 수명주기 문제가 아닙니다.

내 MasterPage

<link rel="shortcut icon" href="<%#ResolveUrl("~/favicon.ico") %>" /> 
    <script type="text/javascript"> 
     var applicationRoot = "<%# webController.AppUrl %>"; 
    </script> 
    <asp:Literal ID="litJqueryMinified" runat="server" /><asp:PlaceHolder id="phjQuery" runat="server"><script src="Script/jquery-1.3.2.js" type="text/javascript"></script></asp:PlaceHolder> 
    <asp:Literal ID="litJqueryUIMinified" runat="server" /><asp:PlaceHolder id="phjQueryUI" runat="server"><script src="Script/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script></asp:PlaceHolder> 
    <script src="<%#ResolveUrl("~/Script/jquery.fancybox-1.2.1.pack.js") %>" type="text/javascript"></script> 
    <script src="<%#ResolveUrl("~/Script/jquery.maskedinput-1.2.2.min.js") %>" type="text/javascript"></script> 
    <script src="<%#ResolveUrl("~/Script/jquery.cycle.all.min.js") %>" type="text/javascript"></script> 

의 머리에서이 있고 코드 숨김에서이 ​​:

 // Swap the jQuery inlcude for the minified version 
     phjQuery.Visible = false; 
     phjQueryUI.Visible = false; 
     string jQueryAddress = currentSettings != null && currentSettings["jQueryLocation"] == "local" ? ResolveUrl("Script/jquery-1.3.2.min.js") : "https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"; 
     string jQueryUIAddress = currentSettings != null && currentSettings["jQueryLocation"] == "local" ? ResolveUrl("Script/jquery-ui-1.7.2.custom.min.js") : "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"; 
     litJqueryMinified.Text = "<script src=\"" + jQueryAddress + "\" type=\"text/javascript\"></script>"; 
     litJqueryUIMinified.Text = "<script src=\"" + jQueryUIAddress + "\" type=\"text/javascript\"></script>"; 

이 날이 축소 된 또는 생산에 구글에 의해 호스팅 가질 수 있지만, 사용 dev에 완전한 버전 intellisense와 함께.

이 때 ResolveUrl이 일을 얻을 수 있도록하여 Page_Load에서 이것을 잊지 마세요 :이 도움이

  Page.Header.DataBind(); 

희망을. :)

+0

감사합니다! init 및 load 이벤트가 실행되는 순서를 추적하고 솔루션이 제대로 작동했음을 알았습니다. – sarsnake

+0

굉장합니다. 페이지에는 PreInit이 있지만 마스터 페이지에는 PreInit이 없습니다. – Chris

1

우선이다, Page.Controls.Add는 HTML 문서에서 임의의 장소에서 스크립트 블록을 추가합니다. 실제로 헤더 파일이나 페이지 하단에 스크립트 파일을 추가해야합니다 (온라인 검색은 UI 성능 향상을 위해 페이지의 맨 아래가 좋음을 알려줍니다).

자바 스크립트 파일의 올바른 순서를 유지하기 위해 ASP.Net AJAX Script LoaderScript Manager을 조사했습니다.

Script Manager은 스크립트를 올바른 순서로 추가하면 작동합니다. 문제를 더 잘 해결할 수 있습니다. AJAX Script Loader

+0

:

당신이 경고 또는 유사한 무언가를로드하는 경우, 같은 것을 사용합니다. Page.Controllers.Add가 아니라 Page.Header.Controls.Add를 사용합니다. 모든 스크립트가 헤더에 추가된다는 것을 확인 했으므로 문제는 아닙니다. – sarsnake

+0

문제를 이해합니다. 스크립트 태그가 있어야하는 곳은 측면입니다. 귀하의 문제를 해결하기 위해 AJAX Script Loader를 살펴 보겠습니다. 간단한 해결책은 사용자 컨트롤을 위해 페이지의 맨 아래에 스크립트를로드하고 마스터 페이지의 맨 위에 스크립트를로드하는 것입니다. –

1

ScriptManager를 사용하십시오.그것은 매우 쉽습니다 :이 모든 페이지/컨트롤에

<asp:ScriptManager ID="MasterPageScriptManager" runat="server" /> 

그리고 스크립트 관리자 프록시 :

<asp:ScriptManager ID="SM1" runat="server"> 
    <Scripts> 
    <asp:ScriptReference Name="Script.js" /> 
    </Scripts> 
</asp:ScriptManager> 

가 더욱 쉽게, 당신은 당신의 masterpage에 빈 스크립트 관리자 컨트롤을 추가하려면 사용자 정의 스크립트로드 됨 :

<asp:ScriptManagerProxy ID="SM1" runat="server"> 
    <Scripts> 
    <asp:ScriptReference Name="Script.js" /> 
    </Scripts> 
</asp:ScriptManagerProxy> 

편집 :이게 당신이 찾고있는 것이 아니라면, 사과드립니다. 당신은 단지 스크립트의 적절한 위치를 찾기 위해 노력하는 것 같습니다. 이러한 경우 당신이 할 수있는 또 다른 것은 당신의 masterpage에 jQuery를하고 향후 스크립트를 포함하는 것입니다 :

<script type="text/javascript" src='<%= ResolveUrl("~/js/script.js") %>'></script> 
난 당신이 동적으로 자바 스크립트 코드를 작성하지 않는 한 코드 숨김에서 자바 스크립트를로드하지 않는 것이 좋습니다 것

을, 또는 응용 프로그램을 작성하여 다른 사용자에게 공개하여 UI를 조정할 수 있으며 해당 기능이 변경되는 것을 원하지 않습니다. 내 코드를 수정

string myScript = "$(document).ready(function() { alert('message');});"; 
Page.ClientScript.RegisterClientScriptBlock(this.Page.GetType(), "alerting", myScript, true); 
+0

그래서 JS가 ascx 파일 안의 코드에서 머리로 삽입 될 수 없습니까? 본질적으로 내가 갖고 자했던 것은 사용자 컨트롤을 사용하는 페이지에 j를 포함 할 필요가없는 자체 포함 된 사용자 컨트롤입니다. 모든 css와 js가 자동으로로드됩니다. 물론 마스터 페이지 안에 사용자 컨트롤을위한 스크립트를 포함 할 수는 있지만 그저 잘못된 것처럼 보일 수 있습니다. 여기에 포함될 필요는 없습니다. 사용자 컨트롤이 사용되는 곳에 포함될 필요가 있습니다. 이것은 매우 실망 스럽습니다 .net 제작자가 무엇인지 확신 할 수 없습니다. – sarsnake

+0

내일 일하게 될 때 당신의 해결책을 시도 할 것입니다, 감사합니다! – sarsnake

관련 문제