Fork me on GitHub

【转】怎么让开发的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,同时保持原先页面的使用。


posted @ 2011-08-14 14:43  _落雨  阅读(175)  评论(0编辑  收藏  举报