自定义对象类不与ViewState持久化

时间:2015-07-02 13:35:08

标签: c# asp.net serialization nullreferenceexception viewstate

我在命名空间中有一个名为 results 的私有Seri​​alizable自定义对象类,用于存储文件上传/服务器推送的结果:

RegisterOpenGeneric

我在代码中以标准方式设置对象的成员,即 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; } } ... } 等。

我将对象添加到ViewState:

res.fileName = fileUpload.FileName;

尝试检索它,如下所示:

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 } } 行上一直收到nullReferenceException。

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

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我弄清楚出了什么问题。

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

如果你遇到的问题是你的ViewState / Session变量为null 第一次回发但是后续回发包含来自上一次请求的变量,那就是发生。

澄清:假设每次插入数据(在button_onClick函数上发生)后,我想在标签中显示插入的结果。以下操作依次举例说明:

  1. 选择有效文件,其中包含要上传的数据 - >点击上传 - >发生回发并且ViewState / Session变量为 null
  2. 选择无效要上传的文件 - >点击上传 - >发生回发并且ViewState / Session变量读取 true
  3. 选择要上传的有效文件 - >点击上传 - >发生回发并且ViewState / Session变量读取 false
  4. 因此,您可以看到跟随回发后可以看到更新后的变量。

    基本上,我根本不需要使用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)
    

    通过遵循这些面包屑,您可以非常快速地识别页面生命周期的进展顺序。