由于viewstate太大了,现在能做的就是优化,还有一些控件禁止了viewstate,各位还有没有别的招~~~

解决方案 »

  1.   

    我大部分是整个页面禁用 的 ..如果全用ajax  就没有了viewstate 了
      

  2.   

    你用hiddenfiled的话,就可以禁用viewstate 了
      

  3.   

    对于ViewState存储的知识,首先应该掌握Page对象类的 PageStatePersister 属性。在几年前就发布的asp.net2.0中提供了一个SessionPageStatePersister 对象类供使用,可惜竟然连专业asp.net开发人员也很少人知道它。如果你的session不会丢失,例如保存在状态服务器、SQL Server,或者自己写了序列化到服务器磁盘文件中的机制,则可以放心地使用SessionPageStatePersister。我在以前写过一个直接序列化ViewState的方法,它是作为所有Page的父类来设计的。这里再贴一遍:using System;
    using System.IO;
    using System.Web.UI;public class XVPage : Page
    {
        static private DirectoryInfo _Dir;    private DirectoryInfo Dir
        {
            get
            {
                if (_Dir == null)
                {
                    _Dir = new DirectoryInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));
                    if (!_Dir.Exists)
                        _Dir.Create();
                    _Dir = new DirectoryInfo(Path.Combine(_Dir.FullName, "ViewState"));
                    if (!_Dir.Exists)
                        _Dir.Create();
                }
                return _Dir;
            }
        }    protected override object LoadPageStateFromPersistenceMedium()
        {
            PageStatePersister ps = this.PageStatePersister;
            ps.Load();
            if (ps.ControlState != null)
                ps.ControlState = 反序列化对象((string)ps.ControlState);
            if (ps.ViewState != null)
                ps.ViewState = 反序列化对象((string)ps.ViewState);
            return new Pair(ps.ControlState, ps.ViewState);
        }    protected override void SavePageStateToPersistenceMedium(object state)
        {
            PageStatePersister ps = this.PageStatePersister;
            if (state is Pair)
            {
                Pair pair = (Pair)state;
                ps.ControlState = pair.First;
                ps.ViewState = pair.Second;
            }
            else
            {
                ps.ViewState = state;
            }
            if (ps.ControlState != null)
                ps.ControlState = 序列化对象(ps.ControlState);
            if (ps.ViewState != null)
                ps.ViewState = 序列化对象(ps.ViewState);
            ps.Save();
        }    private object 反序列化对象(string stateID)
        {
            string stateStr = (string)Cache[stateID];
            string file = Path.Combine(Dir.FullName, stateID);
            if (stateStr == null)
                stateStr = File.ReadAllText(file);
            else
                Cache.Remove(stateID);
            return new ObjectStateFormatter().Deserialize(stateStr);
        }    private string 序列化对象(object obj)
        {
            string value = new ObjectStateFormatter().Serialize(obj);
            string stateID = (DateTime.Now.Ticks + (long)value.GetHashCode()).ToString(); //产生离散的id号码   
            File.WriteAllText(Path.Combine(Dir.FullName, stateID), value);
            Cache.Insert(stateID, value);
            return stateID;
        }    protected override void OnUnload(EventArgs e)
        {
            base.OnUnload(e);
            DateTime dt = DateTime.Now.AddMinutes(-20);
            foreach (FileInfo fl in Dir.GetFiles())
                if (fl.LastAccessTime < dt)
                    try
                    {
                        fl.Delete();
                    }
                    catch
                    {
                    }
        }
    }