我有以下属性来保存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
答案 0 :(得分:1)
IIS工作进程回收不应该影响ViewState。回收可以影响Session
和Application
状态,但ViewState
只是页面上的加密隐藏字段。如果它影响ViewState,您很可能会得到以下异常:
ViewState对此页面无效,可能已损坏。
查看此支持article,看看是否有任何建议有帮助。
答案 1 :(得分:0)
问题不在于ViewState。问题是如果没有正确理解后果,我在同一个aspx页面中定义了ViewStateModel类。由于aspx文件夹被编译成具有随机名称的dll,ViewState中的序列化类可能会变为无效,如果文件夹被重新编译,甚至跨Web场中的服务器。根据{{3}}
对象的公共和私有字段以及类的名称(包括包含该类的程序集)将转换为字节流
因此,由于dll的名称不相同,因此反序列化失败。正确的做法是将所有模型定义在App_Code或完全不同的类项目中的单独类文件中