【转】怎么让开发的aspx返回的页面网页源文件中没有“乱码”ViewState???

问:怎么让开发的aspx返回的页面网页源文件中没有Value="/wEPDwUKMTQxODY3MTE1NWRk9iXX,什么hidden" name="__EVENTTARGET" 这些东西?

说明:返回的页面代码都是标准的HTML组件?有例子没有?推荐书籍也可以。
开发的ASPX网页导出都是下面这些东西,
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTQxODY3MTE1NWRk9iHjuuUMfWmhGo2eEV4u7BYhLxA=" />
又是VALUE是一大堆东西?

我看有些的ASPX网站,查看网页源文件,代码贴别的干净。就是JS和标准的HTML标签。


去掉asp.net网页打开后用右键查看源代码中间有一段乱码

回答一:
<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
加上EnableViewState="false"这个就OK了 不要显示视图状态,

我试过,实际上无法关闭ViewState。,不行。

回答二:

在asp时代, 大家都知道一个html控件的值,比如input 控件值,当我们把表单提交到服务器后, 页面再刷新回来的时候, input里面的数据已经被清空. 这是因为web的无状态性导致的, 服务端每次把html输出到客户端后就不再于客户端有联系.

asp.net巧妙的改变了这一点. 当我们在写一个asp.net表单时, 一旦标明了 form runat=server ,那么,asp.net就会自动在输出时给页面添加一个隐藏域

<input type="hidden" name="__VIEWSTATE" value="">

那么,有了这个隐藏域,页面里其他所有的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面. 每次页面提交时一起提交到后台,asp.net对其中的值进行解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8....
很多人会认为这是加密的信息,其实不是, ms仅仅是给各个控件和页面的状态存入适当的对象里面,然后把该对象序列化, 最后再做一次base64编码,直接赋值给viewstate控件.

说到这,想必你一定想看看这个viewstate里面到底存了哪些东西, 嗯,你是可以写一个base64 to string的转换代码来实现.不过,viewstate是有层次之分的,普通的转换后,你看到的也是很乱的文字. 这里提供了一个专门转换viewstate值的地方http://www.wilsondotnet.com/Demos/ViewState.aspx. 你可以去将自己的viewstate输入进去,让它给你转化一下,这可是带结构的哦

好, 以上说的这些你可能会觉得: 这与session有什么关系? 这个viewstate不是由asp.net自动去维护吗? 是的, 如果仅仅是保存控件的状态, 你可以感觉不到它与session有什么瓜葛( 呵呵,其实它们就没有瓜葛),不过,接下来,我们看看这种使用方法: 在后台aspx.cs代码里:

private void Page_Load(object sender, System.EventArgs e)
{
ViewState["myvalue"] = "viewstatevalue";
//.....
}

呵呵, 可以在页面后台直接给viewstate集合赋值, 现在你是不是觉得和session的使用方法差不多了呢? 对,这一点就是几乎所有初学asp.net的人的疑惑. 会认为asp.net也像session那样把这个值保存到服务器内存里面, 其实不是!

那么,这里的viewstate值是属于谁?又存在哪里? 其实,它和上面的其他控件的状态保存一样,也是存储到那个隐藏的viewstate控件值里面, 上面已经说了, viewstate用来保存状态,包括页面本身, 那么,这里的viewstate就属于页面本身的状态.

转载者认为:看样子还得按照老样子的ASP或者ASP记事本来编写ASP.NET代码了,和早期的ASP开发没有什么不同。

方法:

这是你用ASP.NET控件自动生成的,无法去除如果你想代码整洁,尽量使用Html标签

那个是ASP生成的时候自动生成的HTML代码,这个不会影响你的页面的

这是你用ASP.NET控件自动生成的,无法去除如果你想代码整洁,尽量使用Html标签================================================= asp.net页面去掉ViewState的input方法一:在顶部中加入 EnableViewState="false" EnableViewStateMac="false",就可以去掉了,前提是你用不到它(这个方法有时候并没有彻底去掉了__VIEWSTATE代码)<%@ Page Language="C#" EnableViewState="false" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %> ViewState的input是指:<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTEzN"/>方法二:

  asp.net 去掉viewstate 收藏

转载地址:http://blog.csdn.net/zhou5157/archive/2010/05/07/5567667.aspx
解决办法:app_code/ 存放一个类 用来截获HTTP
1.代码如下

using System;
using System.IO;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;


/// <summary>
/// Removes whitespace from the webpage.
/// </summary>
public class ViewstateModule : IHttpModule
{

    #region IHttpModule Members

    void IHttpModule.Dispose()
    {
        // Nothing to dispose;
    }

    void IHttpModule.Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    #endregion

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        //if (app.Request.Url.OriginalString.Contains(".aspx"))
        //{
        //  app.Response.Filter = new ViewstateFilter(app.Response.Filter);
        //}
        //reg/目录下的不进行优化 因为发现render 后,验证码不能显示
        if (!app.Request.Url.OriginalString.Contains("/reg/"))
        {
            if (app.Request.Url.OriginalString.Contains(".aspx"))
            {
                app.Response.Filter = new ViewstateFilter(app.Response.Filter);
            }
        }

        //静态化后重也要处理
        if (app.Request.Url.OriginalString.Contains(".html"))
        {
            app.Response.Filter = new ViewstateFilter(app.Response.Filter);
        }
    }

    #region Stream filter

    private class ViewstateFilter : Stream
    {

        public ViewstateFilter(Stream sink)
        {
            _sink = sink;
        }

        private Stream _sink;

        #region Properites

        public override bool CanRead
        {
            get { return true; }
        }

        public override bool CanSeek
        {
            get { return true; }
        }

        public override bool CanWrite
        {
            get { return true; }
        }

        public override void Flush()
        {
            _sink.Flush();
        }

        public override long Length
        {
            get { return 0; }
        }

        private long _position;
        public override long Position
        {
            get { return _position; }
            set { _position = value; }
        }

        #endregion

        #region Methods

        public override int Read(byte[] buffer, int offset, int count)
        {
            return _sink.Read(buffer, offset, count);
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return _sink.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            _sink.SetLength(value);
        }

        public override void Close()
        {
            _sink.Close();
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            byte[] data = new byte[count];
            Buffer.BlockCopy(buffer, offset, data, 0, count);
            string html = System.Text.Encoding.Default.GetString(buffer);

            int startPoint = html.IndexOf("<input type=\"hidden\" name=\"__VIEWSTATE\"");
            if (startPoint >= 0)
            {
                int endPoint = html.IndexOf("/>", startPoint) + 2;
                string viewstateInput = html.Substring(startPoint, endPoint - startPoint);
                html = html.Remove(startPoint, endPoint - startPoint);
                int formEndStart = html.IndexOf("</form>") - 1;
                if (formEndStart >= 0)
                {
                    html = html.Insert(formEndStart, viewstateInput);
                }
            }
            //Nick  add   2010.05.07
            startPoint = html.IndexOf("<input type=\"hidden\" name=\"__EVENTVALIDATION\"");
            if (startPoint >= 0)
            {
                int endPoint = html.IndexOf("/>", startPoint) + 2;
                string viewstateInput = html.Substring(startPoint, endPoint - startPoint);
                html = html.Remove(startPoint, endPoint - startPoint);
                int formEndStart = html.IndexOf("</form>") - 1;
                if (formEndStart >= 0)
                {
                    html = html.Insert(formEndStart, viewstateInput);
                }
            }
            //end add
            byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
            _sink.Write(outdata, 0, outdata.GetLength(0));
        }

        #endregion

    }

    #endregion

}
 

2.在web.config   加入以下代码
<httpModules>
<add type="ViewstateModule" name="ViewstateModule"/>
</httpModules>

就能去掉viewstate,但是页面的状态就没有了。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou5157/archive/2010/05/07/5567667.aspx

asp.net在SEO上的致命要素:冗余代码,去掉viewstate生成的代码

asp.net生成的viewstate垃圾信息超过了20K,如果页面前二K不是内容会被引擎处罚。

1.网上查找解决办法,将viewstate信息移动到页面的最后。采用此办法的确把viewstate 移到网页尾部,但也造成了部分网页显示不正常。后来发现可以关闭网页的viewstate 装态,把viewstate 变小。

  比如:

  value=" http://blog.soso.com/wEPDwUJNjE5MDk0OTc0D2QWAmYPZBYCAgMQZGQWBAI BD2QWCAIDDxYCHgdWaXNpYmxlaGQCBQ8WAh4EVGV4dAVmPGEgaH JlZj0idXJsLmFzcHg/dXJsPXd3dy5pZ3hlLmNvbS5jbiIgdGFyZ 2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJpbWFnZXMvc2hvdy90b3Aw MDEuZ2lmIiBhbHQ9IiIgLz48L2E+ZAIHDxYCHgtfIUl0ZW1Db3V udAIQFiBmD2QWAmYPFQMmaHR0cDovL3d3dy56aHVhbnlld2Fuam lhLmNvbS9SYW5rLmh0bWwDcmVkDOa4uOaIj+aOkuihjGQCAQ9kF gJmDxUDKmh0dHA6Ly93d3cuemh1YW55ZXdhbmppYS5jb20vR2Ft ZVNpdGUuaHRtbARibHVlDOa4uOaIj+WumOe9kWQCAg9kFgJmDxU DJ2h0dHA6Ly93d3cuemh1YW55ZXdhbmppYS5jb20vVG9vbHMuaH RtbANyZWQM5Zyo57q/5bel5YW3ZAIDD2QWAmYPFQMtaHR0cDovL 3d3dy56aHVhbnlld2FuamlhLmNvbS9OZXdzLjUuTGlzdC5odG1s BGJsdWUM572R5ri45oqA5pyvZAIED2QWAmYPFQMpaHR0cDovL3d 3dy56aHVhbnlld2FuamlhLmNvbS9HYW1lQXBwLmh0bWwDcmVkD+ .....

 2.查询老外的解决办法,是将代码移动到尾部,但发现部分网页报错, 之后发现把网页的enableviewatate=false 明显的viewstate 代码减少。

  原因总结:

  (1)、这是由于net记录控件视图状态的. asp.net服务器控件默认都记录的.

  如果你确定一个控件是不需要记录控件状态,可以给他的EnableViewState赋值false禁用.

  个人总结:

  关闭视图也不是最终解决办法,只会减少,最彻底的办法就是把form表单做成普通的html标签。

  省去runat="server"就可以。程序尽管重要,但如果做出来的程序没有什么效果,是没有意义的,

  网友见解:

  视图状态,这可不是什么无用的代码。你使用服务器控件,为什么在每一次提交后,会将信息以控件对象的方式读取到呢?都是因为有了视图状态。

  视图状态是可以禁用的,不过只使用EnableViewState=false是不彻底的,你还会在页面中看到__VIEWSTATE的隐藏域。这是因为就算禁用了他,还是会有一个服务器控件在那里使用,就是from runat="server",如果你将from编程普通html标签,那么页面就干净了。

  当然,禁用视图状态后,是会提升系统效率的,因为程序不会再去分析视图状态中值,再为控件对象初始化了。这样做对于网站来说是高效的,但如果是做引用程序,那就有点自找麻烦了。微软提供了这么方便的方法你不用,可不是自讨苦吃吗?! 加载中,请稍候......
=========================================


去掉.net页面中的<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE ?

不用去掉
protected override object LoadPageStateFromPersistenceMedium()
{
return null;
}

protected override void SavePageStateToPersistenceMedium(object viewState) { }
重写这两个方法就可以


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//添加引用
using System.IO;
using System.Threading;
namespace CCL
{
   /// <summary>
    /// BasePage 的摘要说明
   
   public class BasePage : System.Web.UI.Page
    {
       
        //由于这里添加了目录,所以要建立App_Data/ViewState目录.
        protected override object LoadPageStateFromPersistenceMedium()
        {
            string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
            )Cache[viewStateID];
            if (stateStr == null)
            {
                string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
                stateStr = File.ReadAllText(fn);
            }
            return new ObjectStateFormatter().Deserialize(stateStr);
        }

        protected override void SavePageStateToPersistenceMedium(object state)
        {
            string value = new ObjectStateFormatter().Serialize(state);
            string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
            string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
            //ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
            File.WriteAllText(fn, value);
            Cache.Insert(viewStateID, value);
            base.SavePageStateToPersistenceMedium(viewStateID);
        }
        #endregion
    }
}

string stateStr = (string#region 解决ViewState过于庞大的问题/// </summary>
不过这样写会产生大量的ViewState文件。垃圾文件与垃圾代码,你会如何选择呢?
==============================================================

页面上的 所有runat="server"去掉, 不要用任何的 服务器控件, 全部采用HTML控件开发,就可以做到, BBSMAX就是.NET开发的, 那看页面源代码,也没有VIEWSTATE其他方法: http://www.jb51.net/article/17589_2.htm http://blog.163.com/xu_ming_003/blog/static/122559492010102211233842/去掉.net页面中的<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE2009-03-07 19:28

你可以post,get方法提交

<form action="xxx.aspx" ...>,去掉原来的runat = server

微软的webForm使很多没接触过asp,jsp..等的新手变成了傻子.-_-!

ViewState 在 Page.SavePageStateToPersistenceMedium 方法中被保存, 回发时,在 Page.LoadPageStateFromPersistanceMedium 方法中被恢复。 这是我在看“木野狐”翻译的一篇文章中看到的,那么我们可以将其存到session中去,代码如下,来自网络,自做简单修改:

 // 去除VIEWSTATE 生成源代码,并保证VIEWSTATE 同时有效

        protected LosFormatter losFormatter = new LosFormatter();

        protected override object LoadPageStateFromPersistenceMedium()

        {

            string key = Request.Url + "__VIEWSTATE";

            if (Session[key] != null)

            {

                System.IO.MemoryStream stream = (System.IO.MemoryStream)Session[key];

                stream.Seek(0, System.IO.SeekOrigin.Begin);

                return losFormatter.Deserialize(stream);

            }

            return null;

        }

        protected override void SavePageStateToPersistenceMedium(object viewState)

        {

            string key = Request.Url + "__VIEWSTATE";

            System.IO.MemoryStream stream = new System.IO.MemoryStream();

            losFormatter.Serialize(stream, viewState);

            stream.Flush();

            Session[key] = stream;

        }

那么看看现在的viewstate:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id=" __VIEWSTATE" value="" />

到这一步,我们实现我们要用的功能,去除viewstate,同时保持原先页面的使用。


转载于:https://www.cnblogs.com/ae6623/archive/2011/08/14/4416804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机生成指定数量的人名字,如下面的运行结果: 100个男性名字 古彬邦 司徒军会 饶光振 乐东涛 史哲广 李岩安 邓松勇 韩彪诚 时辉东 齐才贵 欧坚飞 丁江彬 黎飞哲 江进坚 骆富壮 毕壮山 石涛江 倪俊河 郎刚兴 黄强宁 蔡胜新 车先保 宁杰达 邱成志 贺福震 岑博有 赖贵清 简龙学 范绍光 姜良星 任裕发 柳健民 彭志亮 强义信 廉伟天 穆诚昌 钱兴富 傅元超 潘天峰 池力良 路永国 施新成 甘心林 苏林明 龙峰乐 姬民茂 霍学伟 蒋宁厚 盛清武 关毅生 程思元 华乐刚 方勇功 马祥豪 沈顺强 连达彪 孔超博 陆全健 何明俊 高康心 冯保杰 金河胜 卞豪永 廖星文 区生进 卢有辉 刘广 成浩裕 侯海绍 费功才 皮波海 母利磊 林和波 梅仁利 鲁友敬 秦震先 陈平和 曹文承 莫邦群 常昌康 郭敬义 蒲信仁 葛振松 柯群善 雷会子 罗厚军 符庆思 康亮平 吕世福 白山庆 洪发毅 凌国友 戚善顺 樊武龙 孟子力 胡承浩 丘磊祥 孙世 梁茂岩 龚安全 100个女性名字 路雪芬 樊桂梦 葛璐静 母霞娴 时珊红 梅静颖 宁洁怡 齐琴婵 黎晶玉 欧娜翠 邓玉荷 梁娴娜 关香芳 黄娣美 卞惠凡 费馨琳 胡燕霞 凌莺晶 华怡燕 雷勤月 邱倩佳 皮婵眉 符仪娥 江素瑞 施璧琦 彭娟珊 曹兰莉 丘婉梅 范岚珠 李月娣 卢爱璧 常菁蓉 陈露菊 郎荣纨 孔青媛 鲁环华 孟妍春 柯芬丹 蔡叶君 蒋翠莲 郭芝仪 甘瑶倩 饶玲云 莫蓓青 古颖娟 程莲玲 区娅惠 史菊娅 龚蓉环 姜媛婕 倪雅雅 秦婷蓓 强慧妍 池秋贞 龙萍嘉 钱琳素 柳艳叶 苏荷瑶 孙妹茜 盛瑞雪 赖婕凤 姬彩妹 马珠薇 蒲苑洁 穆淑莺 洪嘉慧 白瑾姣 司徒莉秀 金华雁 吕英彩 高丹岚 贺君琴 石薇璐 乐黛勤 康云苑 任雁珍 岑梦巧 潘锦锦 冯真芝 毕凤秋 连珍馨 何纨萍 廖凡淑 简茜菁 罗佳莎 廉贞爱 车莎艳 沈蕊桂 陆梅香 林秀婉 傅娥兰 侯琼琼 刘眉真 成巧婷 霍美蕊 骆芳瑾 韩姣荣 丁春露 戚琦英 方红黛
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值