欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET页面中去除VIEWSTATE视图状态乱码

程序员文章站 2022-10-25 12:08:40
保存页的所有视图状态信息和控件状态信息。   作者在早期参与的项目中曾遇到这样的需求:基于seo技术的开发,当因为时没有接触的mvc框架的 razor 引擎,所以只能...
保存页的所有视图状态信息和控件状态信息。

 

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