自定义对象类未使用ViewState持久化

本文关键字:ViewState 持久化 未使用 对象 自定义 | 更新日期: 2023-09-27 18:00:46

我的命名空间中有一个名为results的专用可序列化自定义对象类,我用它来存储文件上传/服务器推送的结果:

namespace DataUploadTool
{
enum errors {none, format, data, type, unk};
public partial class uploader : System.Web.UI.Page
{
    private results res;
    [Serializable]
    private class results
    {
        public string errLogPath { get; set; }
        public string fileName { get; set; }
        public int errorType { get; set; }
        public int rowsImported { get; set; }
        public DateTime startTime { get; set; }
        public DateTime endTime { get; set; }
    }
    ...
}

我在代码中以标准方式设置对象的成员,即。res.fileName = fileUpload.FileName;

我将对象添加到ViewState:

void Page_PreRender(object sender, EventArgs e)
    {
        ViewState.Add("resultsLog", res);
    }

尝试这样检索:

protected void Page_Load(object sender, EventArgs e)
    {
        res = new results();
        if (IsPostBack)
        {
            if (ViewState["resultsLog"] != null)
            {
                results test;
                test = (results)ViewState["resultslog"];
                error.Text = test.rowsImported.ToString();
            }
            else // Do things
        }
    }

问题是我一直在error.Text = test.rowsImported.ToString();行得到nullReferenceException。

Visual Studio中内置的数据可视化工具告诉我,测试在从ViewState检索到它的行之后为null,这根本没有任何意义,因为if语句确定它不是null!我完全不知道这是怎么发生的,也不知道为什么会发生。

感谢您的帮助!

自定义对象类未使用ViewState持久化

我发现了问题所在。

PostBack发生在ViewState保存之前,因为在此之前调用了我的数据库填充函数。

如果您遇到ViewState/Session变量为null的问题,第一次回发,但继续回发包含上一次请求中的变量,则会发生这种情况。

澄清:假设每次插入数据库(发生在button_Click函数上)后,我都想在标签中显示插入的结果。以下行动举例说明了这一点:

  1. 选择要上载数据的有效文件->单击上载->发生回发,ViewState/Session变量为null
  2. 选择要上载的无效文件->单击上载->发生回发,ViewState/Session变量读取true
  3. 选择要上传的有效文件->单击上传->发生回发,ViewState/Session变量读取false

因此,正如您所看到的,更新后的变量对于后面的回发是可见的。

从本质上讲,我根本不需要使用ViewState或Session。我可以在onClick函数结束时对对象数据进行操作,因为当时已经发生了回发。

TL;DR:如果您遇到ViewState或Session变量/对象未持久化的问题,或者遇到奇怪的"一次性"逻辑错误,则在涉及以下内容的每行代码处添加断点:

- View/Session state setting/getting
- Function declarations which call these getters/setters
- Any function which accesses database data (reading/writing)

通过遵循这些面包屑,您将很快识别页面生命周期的进展顺序。