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

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

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

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

“ 乱码 ”如下:

1 <div class="aspNetHidden">
2 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAevVXD1oYELeveMr0vHCmYP7LzJrIcTIdqhSMKVwuzUlG+r/E5r2IBU8/usjBP6bvE2c4iS0S7hMhxw1JoNuYef5SWTLAaw1o1yUXny4tbozOKqfv7TXcRdFrrz4sk+amqJ1HXkqp47r3PB8OAXkfQkk9SVCu9vqcV7t6ajMdAYdjyd0irvSRGXq8LavSPmz9M=" />
3 </div>

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

时间: 2024-10-06 11:14:40

ASP.NET页面中去除VIEWSTATE视图状态乱码的相关文章

[转] c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求

在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题现在在这里写出来,供和我一样水平不高的参考一下. 在写本文之前参照了一下文章 欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212 http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html C#通过webRequest保持在同一Session中Post数据 http://blog.c

asp.net 页面中添加普通视频的几种方式

第一种 是通过调用window media player进行播放诸如:wmv,asf等格式文件: <object align=center class="OBJECT" classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 height=320 id=MediaPlayer width=356> <param name="ShowStatusBar" value="-1"> 

如何在ASP.NET页面中使用异步任务(PageAsyncTask)

在页面加载期间,可能有些操作是要比较耗用时间的(例如调用外部资源,要长时间等待其返回),正常情况下,这个操作将一直占用线程.而大家知道,ASP.NET在服务端线程池中的线程数是有限的,如果一直占用的话,就会导致其他操作需要等待. 在ASP.NET 2.0中,提供了一种异步页的技术.微软有一个专门的文档介绍这个技术 看看下面这个图,很重要 [注意]ASP.NET的异步机制与windows From的异步机制有一个根本区别,就是因为Response不可以分布发送到客户端的,所以,这个异步的效果对客户

AJAX在GBK编码页面中传中文参数乱码的问题

---恢复内容开始--- 页面编码是GBK的情况下传递中文有乱码,解决方法如下: 在ajax传递前用若是Array,JSON,等其它对象,可用JSON.stringfy字符串序列化后,赋值给ajax传递, 在后台获取后,对于未使用JSON.stringfy序列化的情况下,直接转码:将utf-8转成gbk编码的,再处理. 在后台进行转码. mb_convert_encoding($brand_name, "GBK", "utf-8"); 另一种解决方法 jQuery(

asp.net 页面中引用log4net,添加日志操作

最近在一个项目中使用到了log4net.dll用于记录操作日志,从网上找的大部分资料都是在每个需要输出日志的类中都先声明一下,然后再调用它的输出函数,如debug,error等等 如果是一个小的项目,这样比较简单,使用起来很容易,但是如果项目涉及多个解决方案,比如我现在的贸易系统项目,每天的流水会达到几个亿,会涉及多个操作类型,因此就需要有详细的日志记录信息, 如果还用以前的方式会比较麻烦,因此就按照项目需要,单独创建一个dll用于实现记录日志. 1.下载一个log4net.dll 2.创建一个

Asp.net core中由于页面编码导致的中文乱码

问题描述 最近使用asp.net core写了一个简单的网站,在windows系统下完全没有出现问题.后来在linux系统中搭建了docker,并且在linux中自动使用git获取源码,编译,部署一条龙自动化.结果发现一个奇怪的现象:在控制器的代码中赋值中文给view model,页面显示正常.但如果是在view model中定义中文,页面中的中文会乱码. 原因 根据现象,第一时间想到的是,中文来源的编码出现问题.后来发现因为view model的cs文件都用了gb2312编码了.源码在linu

如何在Silverlight应用程序中获取ASP.NET页面参数

asp.net Silverlight应用程序中获取载体aspx页面参数 有时候SL应用中需要使用由aspx页面中传递过来的参数值,此时通常有两种方法获取 1. 使用InitParameters属性,动态设置传递参数 . 2. 在SL工程中使用HtmlPage类来直接获取页面参数. 如下面的项目结构,我们会在Default.aspx页面中需要传递两个值到SilverlightTestPage.aspx页面,并且需要在SilverlightTestPage.aspx页面所宿主的Silverligh

ASP.NET页面的字符编码设置

在用ASP.NET写网上支付的接口程序时,遇到一个奇怪问题,通过表单提交过去的中文全是乱码,英文正常.而用asp程序进行测试,可以正常提交中文,asp页面中有这样的HTML代码: <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 可是将这个代码加入到ASP.NET页面中,依然解决不了问题.分析了一下,问题应该是编码引起的,对方的程序只能处理GB2312编码的页面提交过

解决ASP.NET页面回车回发的问题

在asp.net页面中在文本框.按钮等服务器控件上回车都会导致页面回发,网上很多解决方案是使用JS来进行event.keyCode==13判断是否按下的回车键,如果是就event.returnValue = false;  但是这只能适用于IE,有些浏览器是不支持event.keyCode的,例如:火狐就是使用evt.which. 这里给大家一个方案,使用后感觉还行,如果有问题请多多包涵,给出建议: 页面代码: <%@ Page Language="C#" AutoEventWi