가 여기에 있습니다. 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);
}
}
}
이 구현에서 제가 좋아하는 것은 특정 페이지에 대해서만 스크립트를로드한다는 것입니다. 어느 곳에서나 사용되지 않는 스크립트의 경우 더 좋을 수 있습니다. 감사. –
누군가 헤더가'if (page.Header! = null)'인지 확인하기 위해 코드에 주목합니까? page.header가 null 인 경우를 알고 싶습니다. @ Chad가 의견을 남길 수 있기를 바랍니다. 감사. –
질문은 http 모듈을 사용하여이 작업을 수행하는 방법이었습니다. – drogon