我在命名空间中有一个名为 results 的私有Serializable自定义对象类,用于存储文件上传/服务器推送的结果:
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!我完全不知道这是怎么发生的。
感谢任何帮助!
答案 0 :(得分:0)
我弄清楚出了什么问题。
PostBack发生在ViewState保存之前,因为我之前调用了数据库填充函数。
如果你遇到的问题是你的ViewState / Session变量为null 第一次回发但是后续回发包含来自上一次请求的变量,那就是发生。
澄清:假设每次插入数据(在button_onClick函数上发生)后,我想在标签中显示插入的结果。以下操作依次举例说明:
因此,您可以看到跟随回发后可以看到更新后的变量。
基本上,我根本不需要使用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)
通过遵循这些面包屑,您可以非常快速地识别页面生命周期的进展顺序。