html5中文学习网

您的位置: 首页 > 网络编程 > ASP.NET » 正文

ASP.NET页面中去除VIEWSTATE视图状态乱码_.NET教程_编程技术

[ ] 已经帮助:人解决问题

首先声明下这篇文章:本文章的发表于2014-10-11日,原作者和版权所有:KoalaAPI(还是本人啦),原链接:http://www.cnblogs.com/KoalaAPI/p/4018727.html(曾被删除!)KgtHTML5中文学习网 - HTML5先行者学习网

保存页的所有视图状态信息和控件状态信息。KgtHTML5中文学习网 - HTML5先行者学习网

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

“ 乱码 ”如下:KgtHTML5中文学习网 - HTML5先行者学习网

<div class="aspNetHidden">
 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAevVXD1oYELeveMr0vHCmYP7LzJrIcTIdqhSMKVwuzUlG+r/E5r2IBU8/usjBP6bvE2c4iS0S7hMhxw1JoNuYef5SWTLAaw1o1yUXny4tbozOKqfv7TXcRdFrrz4sk+amqJ1HXkqp47r3PB8OAXkfQkk9SVCu9vqcV7t6ajMdAYdjyd0irvSRGXq8LavSPmz9M=" />
 </div>KgtHTML5中文学习网 - HTML5先行者学习网

那么所有 问题 就来了,在 商业项目 开发中就需要我们把__Viewstate隐藏域生成的“乱码”去除掉。KgtHTML5中文学习网 - HTML5先行者学习网

这里我们讨论如下几个方案。KgtHTML5中文学习网 - HTML5先行者学习网

方案一:KgtHTML5中文学习网 - HTML5先行者学习网

去掉form的标签的 runat="server" 属性的话,就可以不生成__viewstate隐藏域,但有些情况服务器端控件就没法正常使用了,所以在需要使用服务器端控件的时候就此方并不是太完美。KgtHTML5中文学习网 - HTML5先行者学习网

方案二:KgtHTML5中文学习网 - HTML5先行者学习网

给服务器端正控件的EnableViewState属性设置为false,此时我们发现网页的Viewstate有明显代码减少,但还是存在视图状态。。。KgtHTML5中文学习网 - HTML5先行者学习网

方案三:KgtHTML5中文学习网 - HTML5先行者学习网

些方案需要了解.NET的一些基类,如 System.Web.dll 。KgtHTML5中文学习网 - HTML5先行者学习网

System.Web.dll封装了 LosFormatter 类。KgtHTML5中文学习网 - HTML5先行者学习网

在 MSDN 上对此类的描述是: 序列化 Web 窗体页的视图状态。KgtHTML5中文学习网 - HTML5先行者学习网

此时我们需要LosFormatter类里封装的Serialize方法,功能描述如下:将有限对象序列化 (LOS) 格式的对象转换为视图状态值并将结果放置在 System.IO.Stream 对象中。KgtHTML5中文学习网 - HTML5先行者学习网

去除“乱码”代码如下:KgtHTML5中文学习网 - HTML5先行者学习网

/// <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;  }
KgtHTML5中文学习网 - HTML5先行者学习网
KgtHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助