ASP.NET页面中去除VIEWSTATE视图状态乱码_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > ASP.NET页面中去除VIEWSTATE视图状态乱码

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

 2014/10/11 15:23:39  KoalaAPI  程序员俱乐部  我要评论(0)
  • 摘要:保存页的所有视图状态信息和控件状态信息。作者在早期参与的项目中曾遇到这样的需求:基于SEO技术的开发,当因为时没有接触的MVC框架的Razor引擎,所以只能用ASP.NET引擎,如果使用ASP.NET引擎的服务器端控件,那么在ASP.NET页面中就会生成__Viewstate隐藏域,__Viewstate隐藏域产生的“乱码”对网络爬虫是极其不友好的!!“乱码”如下:<divclass="aspNetHidden"><
  • 标签:.net ASP.NET view net ViewState

 

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

  作者在早期参与的项目中曾遇到这样的需求:基于SEO技术的开发,当因为时没有接触的MVC框架的Razor引擎,所以只能用ASP.NET引擎,如果使用ASP.NET引擎的服务器端控件,那么在ASP.NET页面中就会生成__Viewstate隐藏域,__Viewstate隐藏域产生的“乱码”对网络爬虫是极其不友好的!!
乱码”如下:

class="code_img_closed" src="/Upload/Images/2014101115/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('bcc9a874-1ae5-4f7f-926e-47db8272f9c5',event)" src="/Upload/Images/2014101115/2B1B950FA3DF188F.gif" alt="" />
<div class="aspNetHidden">
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAevVXD1oYELeveMr0vHCmYP7LzJrIcTIdqhSMKVwuzUlG+r/E5r2IBU8/usjBP6bvE2c4iS0S7hMhxw1JoNuYef5SWTLAaw1o1yUXny4tbozOKqfv7TXcRdFrrz4sk+amqJ1HXkqp47r3PB8OAXkfQkk9SVCu9vqcV7t6ajMdAYdjyd0irvSRGXq8LavSPmz9M=" />
</div>
View Code

 所有问题就来了,在商业项目开发中就需要我们把__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;
    }
View Code

 

发表评论
用户名: 匿名