ASP.NET页面中去除VIEWSTATE视图状态乱码
作者在早期参与的项目中曾遇到这样的需求:基于seo技术的开发,当因为时没有接触的mvc框架的 razor 引擎,所以只能用asp.net引擎,如果使用asp.net引擎的服务器端控件,那么在asp.net页面中就会生成 __viewstate隐藏域 ,__viewstate隐藏域产生的“ 乱码 ”对网络爬虫是极其不友好!!
“ 乱码 ”如下:
1 <p class="nethidden">
2 <input type="hidden" name="__eventvalidation" id="__eventvalidation" value="/wedaaevvxd1oyelevemr0vhcmyp7lzjrictidqhsmkvwuzulg+r/e5r2ibu8/usjbp6bve2c4is0s7hmhxw1jonuyef5swtlaaw1o1yuxny4tbozokqfv7txcrdfrrz4sk+amqj1hxkqp47r3pb8oaxkfqkk9svcu9vqcv7t6ajmdaydjyd0irvsrgxq8lavspmz9m=" />
3 </p>
那么所有 问题 就来了,在 商业项目 开发中就需要我们把__viewstate隐藏域生成的“乱码”去除掉。
这里我们讨论如下几个方案。
方案一:
去掉form的标签的 runat="server" 属性的话,就可以不生成__viewstate隐藏域,但有些情况服务器端控件就没法正常使用了,所以在需要使用服务器端控件的时候就此方并不是太完美。
方案二:
给服务器端正控件的enableviewstate属性设置为false,此时我们发现网页的viewstate有明显代码减少,但还是存在视图状态。。。
方案三:
些方案需要了解.net的一些基类,如 system.web.dll 。
system.web.dll封装了 losformatter 类。
在 msdn 上对此类的描述是: 序列化 web 窗体页的视图状态。
此时我们需要losformatter类里封装的serialize方法,功能描述如下:将有限对象序列化 (los) 格式的对象转换为视图状态值并将结果放置在 system.io.stream 对象中。
去除“乱码”代码如下:
复制代码
/// <summary>
/// 去除viewstate乱码代码如下所示:
/// </summary>
protected losformatter losformatter = new losformatter();
/// <summary>
/// 序列化所有视图状态信息和控件状态信息。
/// </summary>
/// <param name="viewstate">要在其中存储视图状态信息的 object</param>
protected override void savepagestatetopersistencemedium(object viewstate)
{
string val = request.url + "__viewstate";
system.io.memorystream stream = new system.io.memorystream();
losformatter.serialize(stream, viewstate);
stream.flush();
session[val] = stream;