保存页的所有视图状态信息和控件状态信息。

 

作者在早期参与的项目中曾遇到这样的需求:基于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;