【问题标题】:Add code in page base to header C#将页面基础中的代码添加到标题 C#
【发布时间】:2014-07-14 22:13:44
【问题描述】:

我的 MasterPageBase.cs 文件中有以下代码:

        protected override void OnLoad(EventArgs e)
    {
        string url = Request.Path;
        var page = _ContentPageRepository.GetContentPageByUrl(url, ConfigurationManager.GetSiteID());
        if (page != null)
        {
            PageBase.SetTitle(page.Title);
            PageBase.SetDescription(page.Description);
            PageBase.SetKeywords(page.Keywords);
        }
        else
        {
            this.ProcessSiteMap();
        }

        this.AddGACode(); 
        base.OnLoad(e); 
    }

我需要this.AddGACode(); 才能添加到页面的 head 部分,但是当我在运行解决方案时查看页面的源代码时,我看到这是将其添加到页面的 body 部分。

我已尝试Page.Header.Controls.Add(AddGACode()); 并收到以下错误: The best overloaded method match has some invalid argumentscannot convert from 'void' to 'System.Web.UI.Control'

我该怎么做才能将此代码添加到头部? TIA

编辑:请求查看 AddGACode 方法:

        private void AddGACode()
    {
        var gaCode = SiteManager.GetSite().GoogleAnalyticsCode;
        if (!String.IsNullOrEmpty(gaCode) && Response.StatusCode == 200)
        {
            if (!ConfigurationManager.EnableUniversalGATracking)
            {
                ClientScriptManager cs = Page.ClientScript;
                StringBuilder csText = new StringBuilder();
                csText.Append("<script type=\"text/javascript\">");
                csText.Append(String.Format("var _gaq = _gaq || []; _gaq.push(['_setAccount', '{0}']); ", gaCode));
                csText.Append("_gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();");
                csText.Append("</script>");
                cs.RegisterClientScriptBlock(GetType(), "GACode", csText.ToString());
            }
            else
            {
                ClientScriptManager cs = Page.ClientScript;
                StringBuilder csText = new StringBuilder();
                csText.Append("<!-- Universal GA Code --><script type=\"text/javascript\">");
                csText.Append(String.Concat("(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', '", gaCode,  " ', 'auto'); ga('send', 'pageview');"));
                csText.Append("</script>");
                cs.RegisterClientScriptBlock(GetType(), "GACode", csText.ToString());
            }
        }
    }

编辑:

此代码在 AddGACode 方法中。页面的OnLoad 中仍有this.AddGACode(); 似乎与此编辑重复代码,但如果我从OnLoad 中删除this.AddGACode();,这两个代码都会消失

ClientScriptManager cs = Page.ClientScript;
StringBuilder csText = new StringBuilder();
csText.Append("<!-- Universal GA Code --><script type=\"text/javascript\">");
csText.Append(String.Concat("(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', '", gaCode,  " ', 'auto'); ga('send', 'pageview');"));
csText.Append("</script>");
cs.RegisterClientScriptBlock(GetType(), "GACode", csText.ToString());
LiteralControl lc = new LiteralControl(csText.ToString());
Page.Header.Controls.Add(lc);

【问题讨论】:

  • 让我们看看AddGACode
  • 抱歉,我编辑了原帖。
  • 我认为这会有所帮助:weblog.west-wind.com/posts/2010/Jan/02/…
  • 我认为我无法提供具体帮助,但问题是 AddGACode 返回 void 但您尝试将其结果分配给 Page.Header.Controls。如果要将控件分配给控件集合,您的方法应该返回一个控件。
  • 既然它在技术上不是一个控件,只是一个被调用的方法,有没有其他方法可以确保谷歌分析代码进入页面头部?

标签: c# asp.net head


【解决方案1】:

这会将脚本添加到 head 标签中:

        LiteralControl lt = new LiteralControl("<script type='text/javascript'>alert('test');</script>");
        Header.Controls.Add(lt);

更新

LiteralControl lt = new LiteralControl(AddGACode());
Header.Controls.Add(lt);

...

private string AddGACode()
{
    var result = string.Empty;
    var gaCode = SiteManager.GetSite().GoogleAnalyticsCode;
    if (!String.IsNullOrEmpty(gaCode) && Response.StatusCode == 200)
    {
        StringBuilder csText = new StringBuilder();
        csText.Append("<script type=\"text/javascript\">");
        if (!ConfigurationManager.EnableUniversalGATracking)
        {
            csText.Append(String.Format("var _gaq = _gaq || []; _gaq.push(['_setAccount', '{0}']); ", gaCode));
            csText.Append("_gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();");
        }
        else
        {
            csText.Append(String.Concat("(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', '", gaCode,  " ', 'auto'); ga('send', 'pageview');"));
        }
        csText.Append("</script>");
        result = csText.ToString();
    }
    return result;
}

【讨论】:

  • 当我添加这个时,它开始向页面添加两次代码。我究竟做错了什么?已编辑原始帖子。
  • 我唯一能想到的就是使用断点来检查您的代码通过这些行的次数以及原因。
  • 嗯,看起来是因为我将它添加到了AddGACode 方法中,并且仍然在被添加两次的页面的OnLoad 中调用了this.AddGACode();。但是,当我从页面的OnLoad 中删除代码时,两个代码都消失了。
  • mmm 删除 AddGACode 中的脚本管理器调用,只需生成脚本并将其放入文字中(用此示例更新了我的答案)。
  • 感谢您喜欢我的回答,但以您自己的方式复制它被认为是不好的形式。请务必提及我的答案,但请不要复制它。
【解决方案2】:

我会将您的标记(在本例中为您的 ga 脚本)保留在母版页上。在 head 标记中添加两个文字,gaGaqgaUniversal 然后使用您的逻辑来控制它们的可见性。

<head runat="server"><script type="text\javascript">
       <asp:Literal id="gaGaq" runat="server">
             <!-- Put you gaq code here-->
             <!-- Keep {0} as a place holder for gaqCode -->
             </script>
       </asp:Literal>
       <asp:Literal id="gaUniveral" runat="server">
            <script type="text\javascrtip">
            <!-- Put you universal code here-->
            <!-- Keep {0} as a place holder for gaqCode -->
            </script>
       </asp:Literal>
</head>

C#

private void AddGACode()
{
    var gaCode = SiteManager.GetSite().GoogleAnalyticsCode;
    if (!String.IsNullOrEmpty(gaCode) && Response.StatusCode == 200)
    {
        if(ConfigurationManager.EnableUniversalGATracking)
        {   
            //Set gaCode
            gaUniversal.Text = string.Fomat(gaUniveral.Text, gaCode);
        }
        else
        {  
            //Set gaCode             
            gaGaq.Text = string.Format(ga.Text, gaCode);
        }

        gaUniversal.Visible = ConfigurationManager.EnableUniversalGATracking;
        gaGaq.Visible = !ConfigurationManager.EnableUniversalGATracking;
    }
    else
    {
       //Hide Both literals if no gaCode
       gaUniversal.Visible = gaGaq.Visible = false;
    }
}

您还可以考虑将所有这些放入自定义控件中。如果你有兴趣走这条路,我写了一个blog article 正是针对gaq 风格的谷歌分析,所以我可以把它放到我的许多asp.net 网站上。那篇文章中的代码需要根据您的需要进行修改,但应该足以让您关注。

【讨论】:

  • 这段代码被300多个网站共享,所以需要保留在MasterPageBase中,否则我会有很多Master Pages要更新。 :/ 但这是有用的信息!如果我找到一个可以使用它的网站,我一定会的!
  • @jlg 那是因为我错过了它是母版页基类的部分!
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2011-01-27
相关资源
最近更新 更多