2009-04-27 2 views
1

HttpModule을 사용하여 javascript를 삽입하고 간단한 구성 데이터에서 HEAD 요소로 CSS 링크를 삽입하려고합니다. 어떤 이벤트를 연결해야할지 모르겠습니다. 어떤 팁을위한 HTTPModule Event Execution Order?How2 : 헤드 요소에 js 링크를 넣기위한 HttpModule의 어떤 이벤트

감사에서 도움이 있습니다 Context.BeginRequest를 검색 엔진 최적화 optimalization

에 대한 - 동적으로
masterpage을 변경 context.PreRequestHandlerExecute -

는 Curently 나는
를 사용합니다. 건배, X.

답변

1

가 여기에 있습니다. httpmodule 아이디어가 마음에 들지 않았습니다. 등록을 잊어 버리고 실행되지 않으면 내 앱이 작동하지 않을 것이고 분명하지 않은 버그 일 것입니다. 이 페이지에는 JS가 포함되어 있어야하므로 프로젝트의 기본 페이지 클래스에 넣기로 결정했습니다. 내가 Page.Header.Controls.Add을 사용하는 이유

내가이 년 전에 구현, 그냥 스크립트 이상을 포함 할 수 있기를 원, 그것은 CSS, 메타 태그 등을 지원합니다 .... 나는 잊지 Page.ClientScript.RegisterClientScriptInclude 대신에 이유가있었습니다.

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Web.UI; 

namespace YourNamespace 
{ 
    public class HeaderIncludesManager 
    { 
     private List<string> m_IncludedFiles = new List<string>(); 

     public void IncludeScript(string s) 
     { 
      IncludeScript(s, null); 
     } 

     public bool IsIncluded(string file) 
     { 
      return (m_IncludedFiles.Find(s => s.Equals(file, StringComparison.InvariantCultureIgnoreCase)) != null); 
     } 

     public void IncludeScript(string script, string condition) 
     { 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (!IsIncluded(script) || page == null) 
       return; 

      string scriptFile = string.Format("/{0}/{1}?v={2}", MyConfig.JSDir, script, MyConfig.BuildNumber); 
      if (page.Header != null) 
      { 
       string scriptTag = String.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>\n", scriptFile); 
       if (!String.IsNullOrEmpty(condition)) 
        scriptTag = String.Format("<!--[{0}]><script language=\"javascript\" type=\"text/javascript\" src=\"{1}\"></script><![endif]-->\n", condition, scriptFile); 

       page.Header.Controls.Add(new LiteralControl(scriptTag)); 
       m_IncludedFiles.Add(script); 
      } 
      else if (!page.ClientScript.IsClientScriptIncludeRegistered(GetType(), scriptFile)) 
      { 
       page.ClientScript.RegisterClientScriptInclude(GetType(), scriptFile, scriptFile); 
       m_IncludedFiles.Add(script); 
      } 
     } 

     public void IncludeCss(string css) 
     { 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (!IsIncluded(css) || page == null) 
       return; 

      string cssfile = string.Format("/{0}/{1}?v={2}", MyConfig.CssDir, css, MyConfig.BuildNumber); 
      if (page.Header != null) 
      { 
       ((Page)HttpContext.Current.CurrentHandler).Header.Controls.Add(new LiteralControl(String.Format("<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />\n", cssfile)));      
       m_IncludedFiles.Add(css); 
      } 
     } 

     public void IncludeJQuery() 
     { 
      IncludeScript("jquery-1.2.3.min.js"); 
     } 

     public void IncludeJQueryUI() 
     { 
      IncludeJQuery(); 
      IncludeScript("jquery.ui.1.0.min.js"); 
      IncludeCss("jquery-theme.css"); 
     } 

     public void IncludeFlotScripts() 
     { 
      IncludeJQuery(); 
      IncludeScript("flot/jquery.flot.js"); 
      IncludeScript("flot/excanvas.pack.js", "if IE"); 
     } 
    } 

    public class MyPage : Page 
    { 
     public HeaderIncludesManager HeaderIncludes = new HeaderIncludesManager(); 
    } 

    public class MyControl : UserControl 
    { 
     public new MyPage Page 
     { 
      get 
      { 
       return (MyPage)base.Page; 
      } 
     } 
    } 

    public class SomeControlThatNeedsScripts : MyControl 
    { 
     protected override void OnLoad(EventArgs e) 
     { 
      Page.HeaderIncludes.IncludeJQueryUI(); 
      base.OnLoad(e); 
     } 
    } 
} 
+0

이 구현에서 제가 좋아하는 것은 특정 페이지에 대해서만 스크립트를로드한다는 것입니다. 어느 곳에서나 사용되지 않는 스크립트의 경우 더 좋을 수 있습니다. 감사. –

+0

누군가 헤더가'if (page.Header! = null)'인지 확인하기 위해 코드에 주목합니까? page.header가 null 인 경우를 알고 싶습니다. @ Chad가 의견을 남길 수 있기를 바랍니다. 감사. –

+1

질문은 http 모듈을 사용하여이 작업을 수행하는 방법이었습니다. – drogon

7
using System; 
using System.Web; 
using System.Web.UI; 

namespace YourNamespace 
{ 
    public class YourModule : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.PreRequestHandlerExecute += Application_PreRequestHandlerExecute; 
     } 

     private void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
     { 
      Page page = HttpContext.Current.CurrentHandler as Page; 
      if (page != null) 
      { 
       string script = "/js/jquery.1.3.2.min.js"; 
       if (page.Header != null) 
       { 
        string scriptTag = String.Format("<script language=\"javascript\" type=\"text/javascript\" src=\"{0}\"></script>\n", script); 
        page.Header.Controls.Add(new LiteralControl(scriptTag)); 
       } 
       else if (!page.ClientScript.IsClientScriptIncludeRegistered(page.GetType(), script)) 
        page.ClientScript.RegisterClientScriptInclude(page.GetType(), script, script); 
      } 
     } 

     public void Dispose() { } 
    } 
} 

ASP.Net 라이프 사이클 : 그것은 당신이 찾고있는 그러나 당신이 올바른 방향으로 가고 얻을해야 정확히 무엇을하지 난 당신이 HttpModule을하지 않고 무엇을하고 있는지 구현 방법 http://msdn.microsoft.com/en-us/library/ms178473.aspx

+0

예를 들어 감사합니다. 비슷한 구현을 사용합니다. 나는 올바른 사건을 사용하는 것에 대해 더 시끄 럽다. 예 : 제 경우에는 context.PreRequestHandlerExecute + = ContextPreRequestHandlerExecute;를 사용합니다. 그런 다음 page.PreLoad + = PagePreLoad; PagePreLoad에서 js 요소를 설정하고 잘 작동합니다. 하지만 맞습니까? –

+0

예, 올바른 이벤트입니다. HttpModule에서이 작업을 수행하지는 않았지만 기본 페이지 클래스에서이 작업을 수행합니다. 내가 어떻게했는지 보여주는 또 다른 답변을 올리겠습니다. –

+0

@Chad, 나는 당신의 코드를 사용하고 있지만, 헤더가 아닌 페이지의 몸체에 항상 스크립트가 추가되도록 page.Header는 항상 널입니다. Masterpage에는 가 있어야합니다. 왜 그런지 아십니까? 감사합니다. – Riga