在aspx页面不输出input type=hidden name="__VIEWSTATE"
2007-08-02 17:18
465 查看
这是一个朋友的想法,刚开始我第一感觉是截留HtmlTextWriter的RenderBeforeTag事件
不过发现Input Type="Hidden"都不影应这个事件,郁闷
Reflector查看RegisterHiddenField发现它们都存在于一个私有成员中
最后没办法,只有使用页面过滤器了
因为是一个简单的示例,所以两个类文件写在一起了,编译后生成的dll文件名为Blackant.Controls.dll
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;
namespace Blackant.Controls
...{
/**//// <summary>
/// Summary description for HiddenInputFilter
/// </summary>
public class HiddenInputHttpModule : IHttpModule
...{
IHttpModule Members#region IHttpModule Members
public void Dispose()
...{
//throw new Exception("The method or operation is not implemented.");
}
public void Init(HttpApplication context)
...{
//throw new Exception("The method or operation is not implemented.");
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
#endregion
事件#region 事件
void context_ReleaseRequestState(object sender, EventArgs e)
...{
HttpResponse response = HttpContext.Current.Response;
if (response.ContentType=="text/html")
...{
HiddenInputFilter filter = new HiddenInputFilter(response.Filter);
response.Filter = filter;
}
}
#endregion
IRawPath Members#region IRawPath Members
private string _rawPath = "";
public string GetPath()
...{
return _rawPath;
}
#endregion
}
public class HiddenInputFilter : Stream
...{
私有成员#region 私有成员
Stream responseStream;
long position;
StringBuilder responseHtml;
#endregion
构造#region 构造
public HiddenInputFilter(Stream inputStream)
...{
responseStream = inputStream;
responseHtml = new StringBuilder();
}
#endregion
重写的方法#region 重写的方法
public override bool CanRead
...{
get ...{ return true; }
}
public override bool CanSeek
...{
get ...{ return true; }
}
public override bool CanWrite
...{
get ...{ return true; }
}
public override void Close()
...{
responseStream.Close();
}
public override void Flush()
...{
responseStream.Flush();
}
public override long Length
...{
get ...{ return 0; }
}
public override long Position
...{
get ...{ return position; }
set ...{ position = value; }
}
public override long Seek(long offset, SeekOrigin origin)
...{
return responseStream.Seek(offset, origin);
}
public override void SetLength(long length)
...{
responseStream.SetLength(length);
}
public override int Read(byte[] buffer, int offset, int count)
...{
return responseStream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
...{
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
//找到<input type="hidden" name="__VIEWSTATE"
string pattern=@"<input type=""hidden"" name=""__VIEWSTATE""[^>]*>";
finalHtml=Regex.Replace(finalHtml, pattern, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Multiline);
// Write the response
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);
responseStream.Write(data, 0, data.Length);
}
#endregion
}
}
然后在web项目中引用这个dll
修改web.config,加入以下内容于System.Web配置节
<httpModules>
<add name="HiddenInputFilter" type="Blackant.Controls.HiddenInputHttpModule,Blackant.Controls"/>
</httpModules>
其实核心内容很简单
HiddenInputHttpModule中如下指示使用页面过滤器
HiddenInputFilter filter = new HiddenInputFilter(response.Filter);
response.Filter = filter;
HiddenInputFilter 中则
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
//找到<input type="hidden" name="__VIEWSTATE"
string pattern=@"/<input type=""hidden"" name=""__VIEWSTATE""[^/>]*/>";
finalHtml=Regex.Replace(finalHtml, pattern, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Multiline);
替换掉<input type="hidden" name="__VIEWSTATE" ..../>标签
不过发现Input Type="Hidden"都不影应这个事件,郁闷
Reflector查看RegisterHiddenField发现它们都存在于一个私有成员中
最后没办法,只有使用页面过滤器了
因为是一个简单的示例,所以两个类文件写在一起了,编译后生成的dll文件名为Blackant.Controls.dll
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;
namespace Blackant.Controls
...{
/**//// <summary>
/// Summary description for HiddenInputFilter
/// </summary>
public class HiddenInputHttpModule : IHttpModule
...{
IHttpModule Members#region IHttpModule Members
public void Dispose()
...{
//throw new Exception("The method or operation is not implemented.");
}
public void Init(HttpApplication context)
...{
//throw new Exception("The method or operation is not implemented.");
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
#endregion
事件#region 事件
void context_ReleaseRequestState(object sender, EventArgs e)
...{
HttpResponse response = HttpContext.Current.Response;
if (response.ContentType=="text/html")
...{
HiddenInputFilter filter = new HiddenInputFilter(response.Filter);
response.Filter = filter;
}
}
#endregion
IRawPath Members#region IRawPath Members
private string _rawPath = "";
public string GetPath()
...{
return _rawPath;
}
#endregion
}
public class HiddenInputFilter : Stream
...{
私有成员#region 私有成员
Stream responseStream;
long position;
StringBuilder responseHtml;
#endregion
构造#region 构造
public HiddenInputFilter(Stream inputStream)
...{
responseStream = inputStream;
responseHtml = new StringBuilder();
}
#endregion
重写的方法#region 重写的方法
public override bool CanRead
...{
get ...{ return true; }
}
public override bool CanSeek
...{
get ...{ return true; }
}
public override bool CanWrite
...{
get ...{ return true; }
}
public override void Close()
...{
responseStream.Close();
}
public override void Flush()
...{
responseStream.Flush();
}
public override long Length
...{
get ...{ return 0; }
}
public override long Position
...{
get ...{ return position; }
set ...{ position = value; }
}
public override long Seek(long offset, SeekOrigin origin)
...{
return responseStream.Seek(offset, origin);
}
public override void SetLength(long length)
...{
responseStream.SetLength(length);
}
public override int Read(byte[] buffer, int offset, int count)
...{
return responseStream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
...{
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
//找到<input type="hidden" name="__VIEWSTATE"
string pattern=@"<input type=""hidden"" name=""__VIEWSTATE""[^>]*>";
finalHtml=Regex.Replace(finalHtml, pattern, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Multiline);
// Write the response
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);
responseStream.Write(data, 0, data.Length);
}
#endregion
}
}
然后在web项目中引用这个dll
修改web.config,加入以下内容于System.Web配置节
<httpModules>
<add name="HiddenInputFilter" type="Blackant.Controls.HiddenInputHttpModule,Blackant.Controls"/>
</httpModules>
其实核心内容很简单
HiddenInputHttpModule中如下指示使用页面过滤器
HiddenInputFilter filter = new HiddenInputFilter(response.Filter);
response.Filter = filter;
HiddenInputFilter 中则
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
//找到<input type="hidden" name="__VIEWSTATE"
string pattern=@"/<input type=""hidden"" name=""__VIEWSTATE""[^/>]*/>";
finalHtml=Regex.Replace(finalHtml, pattern, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Multiline);
替换掉<input type="hidden" name="__VIEWSTATE" ..../>标签
相关文章推荐
- aspx页面里不输出 nput type=hidden name="__VIEWSTATE" 的方法
- asp.net 隐藏页面<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=''>的值
- 去掉.net页面中的<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE
- 去掉.net页面中的<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
- 去掉.net页面中的input type=hidden name=__VIEWSTATE id=__VIEWSTATE.doc
- 去掉.net页面中的input type=hidden name=__VIEWSTATE id=__VIEWSTATE
- 解决<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 过长
- 解决<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 过长
- 关于ViewState的问题 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="之后有一大串乱码
- 去掉.net页面中的input type=hidden name=__VIEWSTATE id=__VIEWSTATE.doc
- 关于ViewState的问题 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="之后有一大串乱码
- 去掉.net页面中的input type=hidden name=__VIEWSTATE id=__VIEWSTATE
- aspx 页面中 EnableViewState="false" 的效果
- ID和Name的问题------写个<input type="hidden">在后台取不到值
- <input type="hidden" id="haha" name="wang" value="xiaodong" />
- 用type="hidden"的input保存上个页面选中的值
- asp.net MVC 如何在aspx页面的head标签里输出Key为常量的ViewData呢?
- 保存页面数据的场所——Hidden、ViewState、ControlState