如何将查询字符串添加到我的ASP.NET页面上的每个链接?

时间:2011-10-25 23:24:52

标签: c# asp.net .net

背景:我必须追加查询字符串值,从初次调用网站,每个用户都是唯一的,到每个后续页面调用的每个内部链接,以便他们访问该网站,以保留Google的跟踪信息Analytics(分析)。我在Session_Start期间将这些值存储在Global.asax的Session对象中。我已经创建了一个自定义的Page对象来覆盖CreateHtmlTextWriter,以提供一个自定义的HtmlTextWriter对象,该对象覆盖了检查名称/键以查看它是否为“href”的所有公共AddAttribute和WriteAttribute方法,如果是,则附加其他查询字符串Render过程中值对象的参数。这适用于通过ASP.NET控件生成的链接,即超链接,如:

<asp:HyperLink BackColor="Red" ID="link" runat="server" NavigateUrl="http://www.google.com/" Text="Google" />

但如果只是写了:

,则无效
<a href="http://www.yahoo.com/">Yahoo</a>

直接在aspx页面中。 HtmlTextWriter的哪一部分从aspx页面渲染HTML?

我将我的代码文件包含在我正在努力工作的概念证明中(不会尝试识别链接是内部链接还是外部链接,以后会发生)[这是使用Webforms构建的, .NET Framework 3.5和C#]:

Default.aspx的:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestRenderOverride._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:HyperLink BackColor="Red" ID="link" runat="server" NavigateUrl="http://www.google.com/" Text="Google" />
        <br />
        <a href="http://www.yahoo.com/">Yahoo</a>
    </div>
    </form>
</body>
</html>

Default.aspx.cs(包括自定义Page类和自定义HtmlTextWriter类):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace TestRenderOverride
{
    public partial class _Default : CustomPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            HyperLink hl = new HyperLink();
        }

    }

    public class CustomPage : System.Web.UI.Page
    {
        protected override HtmlTextWriter CreateHtmlTextWriter(TextWriter tw)
        {
            return new CustomHtmlTextWriter(HttpContext.Current, tw);
        }
    }
    public class CustomHtmlTextWriter : HtmlTextWriter
    {
        private string UTM_A;
        private string UTM_B;

        public CustomHtmlTextWriter(HttpContext context, TextWriter writer) : base(writer)
        {
            if (context.Session["Protected_UTM-A"] != null)
            {
                UTM_A = context.Session["Protected_UTM-A"].ToString();
            }
            if (context.Session["Protected_UTM-B"] != null)
            {
                UTM_B = context.Session["Protected_UTM-B"].ToString();
            }
        }
        public CustomHtmlTextWriter(HttpRequest request, TextWriter writer, string tabString)
            : base(writer, tabString)
        {

        }

        private string AppendCustomQueryString(string value)
        {
            if (HasQueryStringValues())
            {
                if (value.Contains('?'))
                {
                    return value + "&" + BuildQueryStringAddition();
                }
                else
                {
                    return value + "?" + BuildQueryStringAddition();
                }
            }
            else
            {
                return value;
            }
        }

        private string BuildQueryStringAddition()
        {
            string returnValue = String.Empty;
            if (!String.IsNullOrEmpty(UTM_A))
            {
                returnValue = "UTM_A=" + UTM_A;
            }
            if (!String.IsNullOrEmpty(UTM_B))
            {
                if (!String.IsNullOrEmpty(returnValue))
                {
                    returnValue += "&UTM_B=" + UTM_B;
                }
                else
                {
                    returnValue = "UTM_B=" + UTM_B;
                }
            }

            return returnValue;
        }

        private bool HasQueryStringValues()
        {
            if (!String.IsNullOrEmpty(UTM_A) || !String.IsNullOrEmpty(UTM_B))
            {
                return true;
            }

            return false;
        }

        public override void AddAttribute(HtmlTextWriterAttribute key, string value)
        {
            if (key == HtmlTextWriterAttribute.Href)
            {
                value = AppendCustomQueryString(value);
            }

            base.AddAttribute(key, value);
        }
        public override void AddAttribute(string name, string value)
        {
            if (name.ToLowerInvariant() == "href")
            {
                value = AppendCustomQueryString(value);
            }

            base.AddAttribute(name, value);
        }
        public override void AddAttribute(HtmlTextWriterAttribute key, string value, bool fEncode)
        {
            if (key == HtmlTextWriterAttribute.Href)
            {
                value = AppendCustomQueryString(value);
            }

            base.AddAttribute(key, value, fEncode);
        }
        public override void AddAttribute(string name, string value, bool fEndode)
        {
            if (name.ToLowerInvariant() == "href")
            {
                value = AppendCustomQueryString(value);
            }

            base.AddAttribute(name, value, fEndode);
        }
        protected override void AddAttribute(string name, string value, HtmlTextWriterAttribute key)
        {
            if ((name.ToLowerInvariant() == "href") || (key == HtmlTextWriterAttribute.Href))
            {
                value = AppendCustomQueryString(value);
            }

            base.AddAttribute(name, value, key);
        }


        public override void WriteAttribute(string name, string value)
        {
            if (name.ToLowerInvariant() == "href")
            {
                value = AppendCustomQueryString(value);
            }

            base.WriteAttribute(name, value);
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name.ToLowerInvariant() == "href")
            {
                value = AppendCustomQueryString(value);
            }

            base.WriteAttribute(name, value, fEncode);
        }

        public override void WriteStyleAttribute(string name, string value)
        {
            if (name.ToLowerInvariant() == "href")
            {
                value = AppendCustomQueryString(value);
            }

            base.WriteAttribute(name, value);
        }

        public override void WriteStyleAttribute(string name, string value, bool fEncode)
        {
            if (name.ToLowerInvariant() == "href")
            {
                value = AppendCustomQueryString(value);
            }

            base.WriteAttribute(name, value, fEncode);
        }

    }
}

的Global.asax:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace TestRenderOverride
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {

        }

        protected void Session_Start(object sender, EventArgs e)
        {
            if (Request.QueryString["UTM_A"] != null)
            {
                Session["Protected_UTM-A"] = Request.QueryString["UTM_A"].ToString();
            }
            if (Request.QueryString["UTM_B"] != null)
            {
                Session["Protected_UTM-B"] = Request.QueryString["UTM_B"].ToString();
            }
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

以下是运行代码并将Web项目的“起始页”设置为“特定页面”时显示的源,其值为“Default.aspx?UTM_A = Georgia&amp; UTM_B = Maryland”:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>

</title></head>
<body>
    <form name="form1" method="post" action="Default.aspx?UTM_A=Georgia&amp;UTM_B=Maryland" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzU0OTY1Mjk1ZGRbJc0Q8nWuQUZrihiKtbAzs/+VPA==" />
</div>

    <div>
        <a id="link" href="http://www.google.com/?UTM_A=Georgia&amp;UTM_B=Maryland" style="background-color:Red;">Google</a>
        <br />
        <a href="http://www.yahoo.com/">Yahoo</a>
    </div>
    </form>
</body>
</html>

3 个答案:

答案 0 :(得分:1)

我很长时间没有触及网页表单,但我认为您需要更新您的主页:

<a href="http://www.yahoo.com/" runat="server">Yahoo</a>

答案 1 :(得分:0)

其他几个选择是

  1. 覆盖页面的渲染方法,使用正则表达式字符串查找href标记并在那里更新。

  2. 在客户端执行此操作。准备好后,通过jquery迭代所有A标签,并从那里更新href属性。您可以执行一些简单的操作,例如将用户数据放入隐藏变量中,以便在更新href值时使用它。我认为这里的优点是你正在将处理推送到客户端,而jquery中的实现将非常简单。

答案 2 :(得分:0)

要在C#中执行此操作,您必须在asp.net完成编写后,在PreRender事件中操作html。虽然这样做似乎很重要。

您可以使用JQuery浏览所有链接并进行更改。这是一个可以做到的小代码。我确信有更好的方法和一些警告。如果你使用jquery,我建议你使用这个插件。

Change URL parameters(堆栈溢出)

<script type="text/javascript">
    $(document).ready(function () {
        $('a[href]').each(function (index) {
            var hr = this.href;
            var toAppend = 'val=100&simple=true';
            hr = hr + ((hr.indexOf('?') > -1) ? '&' : '?');
            hr = hr + toAppend;
            this.href = hr;
        });
    });
</script>