zoukankan      html  css  js  c++  java
  • 【转】怎么让开发的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,同时保持原先页面的使用。


  • 相关阅读:
    设计模式实战应用之五:工厂方法模式
    Codeforces445A_DZY Loves Chessboard(预处理)
    void f(int(&amp;p)[3]){} 和void f(int(*p)[3]){}的差别
    《linux 内核全然剖析》 mktime.c
    Java中对象、对象引用、堆、栈、值传递以及引用传递的详解
    android 仿ios开关控件
    ViewDragHelper实战 自己打造Drawerlayout
    [javase学习笔记]-8.5 statickeyword的使用场景
    玩转图片Base64编码
    Android stuido viewpagerindicator的使用
  • 原文地址:https://www.cnblogs.com/ae6623/p/4416804.html
Copyright © 2011-2022 走看看