4

我有以下属性可以在 ViewState 中保存某些页面级别信息:

protected ViewStateModel Model
    {
        get
        {
            if (_pageModel == null)
            {
                _pageModel = (ViewStateModel) ViewState[_pageModelKey];
                if (_pageModel == null)
                {
                    _pageModel = new ViewStateModel();
                    ViewState[_pageModelKey] = _pageModel;
                }
            }

            return _pageModel;
        }
        set
        {
            ViewState[_pageModelKey] = _pageModel = value;
        }
    }

这很好用,直到 IIS 工作进程被回收。我得到一个

无法将“ViewStateModel”类型的对象转换为“ViewStateModel”类型

现在,如果我调试,我看到 ViewState 仍然包含 ViewStateModel 类型的对象及其所有值,但是如果当我将其类型与我定义的 Model 类进行比较时,它返回 false

// this always returns false if the worker process has been recycled
  ViewState[_pageModelKey] is ViewStateModel  
4

2 回答 2

2

IIS 工作进程回收不应影响 ViewState。循环可以影响SessionApplication状态,但ViewState它只是页面上的一个加密隐藏字段。如果要影响 ViewState,您很可能会遇到以下异常:

ViewState 对此页面无效并且可能已损坏。

查看此支持文章,看看是否有任何建议有帮助。

于 2012-05-04T22:43:58.700 回答
1

问题不在于 ViewState。问题是,在没有正确理解后果的情况下,我在使用它的同一个 aspx 页面中定义了 ViewStateModel 类。由于 aspx 文件夹被编译为具有随机名称的 dll,如果 ViewState 中的序列化类可能会变得无效文件夹被重新编译,甚至在网络场中的服务器之间重新编译。根据二进制序列化

对象的公共和私有字段以及类的名称,包括包含该类的程序集,都被转换为字节流

所以由于dll的名字不一样,反序列化就失败了。正确的做法是将所有模型定义在 App_Code 或完全不同的类项目中的单独类文件中

于 2013-06-11T16:31:04.600 回答