传统方法如下:
protected override void Render(HtmlTextWriter writer)
{
} {
string content = string.Empty;
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
try
{
// 将当前页面的内容呈现到临时的 HtmlTextWriter 对象中
base.Render(htmlWriter);
htmlWriter.Close();
// 得到当前页面的全部内容
content = stringWriter.ToString();
// 替换页面中的部分内容
string newContent = content.Replace("[mxh]", "孟宪会");
// 将新页面的内容显示出来
writer.Write(newContent);
}
catch { }
finally
{
stringWriter.Dispose();
htmlWriter.Close();
htmlWriter.Dispose();
}
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
try
{
// 将当前页面的内容呈现到临时的 HtmlTextWriter 对象中
base.Render(htmlWriter);
htmlWriter.Close();
// 得到当前页面的全部内容
content = stringWriter.ToString();
// 替换页面中的部分内容
string newContent = content.Replace("[mxh]", "孟宪会");
// 将新页面的内容显示出来
writer.Write(newContent);
}
catch { }
finally
{
stringWriter.Dispose();
htmlWriter.Close();
htmlWriter.Dispose();
}
//原创方法如下:这个方法与在render方法里自己实例化一个HtmlTextWriter ,然后调用base.Render的时候传入自己的实例化的HtmlTextWriter 然后获取输出html的区别是:前者能够截获在aspx页面中通过Response.Write的字符串并且顺序正确,后者在Render方法里的字符串content不能截取页面中通过Response.Write的字符串所以会导致输出以后html内容顺序错乱。
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
//Response.Output其实就是一个HttpWriter,Response.OutputStream其实就是HttpResponseStream,Object.ReferenceEquals (Response.Output,(Response.OutputStream as HttpResponseStream)._writer)为true
BindingFlags bind = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.GetField;
//因为HttpWriter._charBuffer这个字符数组的长度是1024,所以推测,一旦某一段字符串超过1024就会创建一个IHttpResponseElement,然后加入到HttpWriter._buffers,HttpWriter._buffers的每一个元素都实现了IHttpResponseElement接口,具体类型可能是HttpResponseUnmanagedBufferElement,HttpSubstBlockResponseElement等类型
ArrayList arr = (ArrayList)Response.Output.GetType().GetField("_buffers", bind).GetValue(Response.Output);
Assembly systemWeb = Assembly.Load("System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
Type type = systemWeb.GetType("System.Web.IHttpResponseElement");
MethodInfo method = type.GetMethod("GetBytes");
StringBuilder sb = new StringBuilder(5000);
//遍历每一个buffer,获取buffer里存储的字符数组,然后转换为字符串
for (int i = 0; i < arr.Count; i++)
{
byte[] buffer = (byte[])method.Invoke(arr[i], null);
//使用当前编码得出已经存储到HttpWriter._buffers中的字符串
sb.Append(Response.ContentEncoding.GetString(buffer));
}
//获取HttpWriter的字符数组缓冲区
char[] charBuffer = (char[])Response.Output.GetType().GetField("_charBuffer", bind).GetValue(Response.Output);
int charBufferLength = (int)Response.Output.GetType().GetField("_charBufferLength", bind).GetValue(Response.Output);
int charBufferFree = (int)Response.Output.GetType().GetField("_charBufferFree", bind).GetValue(Response.Output);
//charBufferLength - charBufferFree 等于字符数组缓冲区已经使用的字符数量
for (int i = 0; i < charBufferLength - charBufferFree; i++)
{
sb.Append(charBuffer[i]);
}
//Response.Output其实就是一个HttpWriter,Response.OutputStream其实就是HttpResponseStream,Object.ReferenceEquals (Response.Output,(Response.OutputStream as HttpResponseStream)._writer)为true
BindingFlags bind = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.GetField;
//因为HttpWriter._charBuffer这个字符数组的长度是1024,所以推测,一旦某一段字符串超过1024就会创建一个IHttpResponseElement,然后加入到HttpWriter._buffers,HttpWriter._buffers的每一个元素都实现了IHttpResponseElement接口,具体类型可能是HttpResponseUnmanagedBufferElement,HttpSubstBlockResponseElement等类型
ArrayList arr = (ArrayList)Response.Output.GetType().GetField("_buffers", bind).GetValue(Response.Output);
Assembly systemWeb = Assembly.Load("System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
Type type = systemWeb.GetType("System.Web.IHttpResponseElement");
MethodInfo method = type.GetMethod("GetBytes");
StringBuilder sb = new StringBuilder(5000);
//遍历每一个buffer,获取buffer里存储的字符数组,然后转换为字符串
for (int i = 0; i < arr.Count; i++)
{
byte[] buffer = (byte[])method.Invoke(arr[i], null);
//使用当前编码得出已经存储到HttpWriter._buffers中的字符串
sb.Append(Response.ContentEncoding.GetString(buffer));
}
//获取HttpWriter的字符数组缓冲区
char[] charBuffer = (char[])Response.Output.GetType().GetField("_charBuffer", bind).GetValue(Response.Output);
int charBufferLength = (int)Response.Output.GetType().GetField("_charBufferLength", bind).GetValue(Response.Output);
int charBufferFree = (int)Response.Output.GetType().GetField("_charBufferFree", bind).GetValue(Response.Output);
//charBufferLength - charBufferFree 等于字符数组缓冲区已经使用的字符数量
for (int i = 0; i < charBufferLength - charBufferFree; i++)
{
sb.Append(charBuffer[i]);
}
}