背景:我必须追加查询字符串值,从初次调用网站,每个用户都是唯一的,到每个后续页面调用的每个内部链接,以便他们访问该网站,以保留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&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&UTM_B=Maryland" style="background-color:Red;">Google</a>
<br />
<a href="http://www.yahoo.com/">Yahoo</a>
</div>
</form>
</body>
</html>
答案 0 :(得分:1)
我很长时间没有触及网页表单,但我认为您需要更新您的主页:
<a href="http://www.yahoo.com/" runat="server">Yahoo</a>
答案 1 :(得分:0)
其他几个选择是
覆盖页面的渲染方法,使用正则表达式字符串查找href标记并在那里更新。
在客户端执行此操作。准备好后,通过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>