1

単純な構成データから HEAD 要素に javascript、css リンクを挿入するための HttpModule が必要です。どのイベントをフックすればよいかわかりません。

現在、マスターページ
を動的に変更するための context.PreRequestHandlerExecute
- SEO 最適化のための Context.BeginRequest を 使用しています。

HTTPModule Event Execution Order?にヘルプがありますか?

ヒントをありがとう。乾杯、X.

4

3 に答える 3

1

HttpModule なしであなたがしていることをどのように実装したかを次に示します。httpmodule のアイデアが気に入らなかったのは、登録を忘れて実行されていないと、アプリが機能せず、明らかなバグではないからです。ページには JS を含める必要があるため、プロジェクトの基本 Page クラスに配置することにしました。

私はこの数年前に実装し、スクリプト以外のものを含めることができるようにしたいと考えていました.css、メタタグなどをサポートしています....なぜPage.ClientScript.RegisterClientScriptIncludeだけではなくPage.Header.Controls.Addを使用したのか忘れてしまいましたしかし、理由がありました。

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);
        }
    }
}
于 2009-04-28T21:33:41.883 に答える
0

このタイプの機能には、HttpHandler を選択することをお勧めします。css と javascript ファイルを組み合わせた例を次に示します。それはまさにあなたが探しているものではありませんが、正しい方向に向かうはずです: http://www.codeproject.com/KB/aspnet/HttpCombine.aspx

于 2009-04-27T12:32:15.987 に答える