ASP.NET之ViewState

来源:互联网 发布:广告优化师前景怎样 编辑:程序博客网 时间:2024/06/06 02:51

用Asp.net编写的网页面,其优点就是编译后运行。

除第一次之处,其运行速度比较快。编写程序时MS提供了大量控件和类库,也比较快速的可以建立目标站点。但用aspnet编写的代码用了大量的控件,运行之后生成的HTML文件查看源代码都有一大堆ViewState垃圾代码,这些垃圾代码,一方面增加了网络传输的负担,另一方面不利于搜索引擎收录,搜索引擎不但对其不感冒,可能因此而非常反感,非常不利于SEO优化。

那么有什么办法可以消除这些ViewState呢。

网络上的做法,一般都是设置 EnableViewState="false".这样可以减少很多垃圾代码,但是不完全,仍然存在隐藏域代码,包括CSDN在内查看页面源代码都可以看到

以下是刚才查看的。

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"  value="/XXXXXX.... (这里很多) " />

这些东西主要是ASP.net 的<asp:button   />提交给Form时储藏信息.只要用到<asp:button>对应的form就必须要加 runat="server" 否则将不能正常运行代码。

那我们从中也可以得到一些启发,主要解决了form 的runat="server" 去掉,是不是可以解决ViewState垃圾代码问题呢,答案是肯定的。

但是不幸的是,form 的runat="server" 去掉之后很多“<asp:”标识的控件用不了。根本发挥不了asp.net控件的优势。

有些提出如果去掉之后,就干脆用html编写了。

 

那么怎么样既能发挥控件的快速编码优势,又能消去大量垃圾代码呢?

 

那么就是要特殊处理一下ViewState, 写一个页面基类BasePage。

BasePage继承Page 即 public class  BasePage:page

先不多说,直接上代码

public class BasePage:Page

{


        /// <summary>
        /// 由于这里添加了目录,所以要建立/ViewState目录.
        /// </summary>
        /// <returns></returns>
        protected override object LoadPageStateFromPersistenceMedium()
        {
            string stateStr = string.Empty;
            object obj = null;
            try
            {
                string viewStateID = ((Pair)base.LoadPageStateFromPersistenceMedium()).Second.ToString();
                stateStr = Cache[viewStateID].ToString();
                if (stateStr == null)
                {
                    string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"ViewState/" + viewStateID);
                    stateStr = File.ReadAllText(fn);
                }
                obj = new ObjectStateFormatter().Deserialize(stateStr);
            }
            catch (System.Exception ex)
            {
                EEY.Common.ErrorLog.WriteErrorToLog("Log", "加载ViewState有误", ex);
            }
            return obj;
        }

        protected override void SavePageStateToPersistenceMedium(object state)
        {
            try
            {
                string basePath = this.Request.PhysicalApplicationPath + "ViewState//";
                string value = new ObjectStateFormatter().Serialize(state);
                //string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
                string viewStateID = DateTime.Now.ToString("yyMMdd");// (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
                string filePath = Path.Combine(basePath, viewStateID);
                //System.Threading.ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
                if (!Directory.Exists(basePath))
                {
                    Directory.CreateDirectory(basePath);
                }
                File.WriteAllText(filePath, value);
                EEY.Common.Caching.Set(filePath, value, null);//加入到缓存
                base.SavePageStateToPersistenceMedium(viewStateID);//先注掉
            }
            catch (System.Exception ex)
            {
                EEY.Common.ErrorLog.WriteErrorToLog("Log", "ViewState生成有误", ex);
            }
        }

}

  /// <summary>
        /// 重载父类OnInit方法
        /// </summary>
        /// <param name="e"></param>
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);  //事件绑定
            this.Load += new EventHandler(PageBase_Load);
          
        }

        /// <summary>
        /// 摘要:页面初始化时执行相关验证
        /// </summary>
        protected void PageBase_Load(object sender, EventArgs e)
        {
             ...//相关处理

               //如权限设置

        }

}

然后在页面继承 BasePage

  public partial class Default : BasePase
    {

      //重写OnLoad方法

      protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
          

        }

}

这类对比原来页面源代码。你会发现截然不同的。页面比较干净了。

另外会在程序根目录下创建一个ViewState文件夹。以文件形式保存,牺牲了一定磁盘空间代价。

原创粉丝点击