自定义对象类未使用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!我完全不知道这是怎么发生的,也不知道为什么会发生。
感谢您的帮助!
我发现了问题所在。
PostBack发生在ViewState保存之前,因为在此之前调用了我的数据库填充函数。
如果您遇到ViewState/Session变量为null的问题,第一次回发,但继续回发包含上一次请求中的变量,则会发生这种情况。
澄清:假设每次插入数据库(发生在button_Click函数上)后,我都想在标签中显示插入的结果。以下行动举例说明了这一点:
- 选择要上载数据的有效文件->单击上载->发生回发,ViewState/Session变量为null
- 选择要上载的无效文件->单击上载->发生回发,ViewState/Session变量读取true
- 选择要上传的有效文件->单击上传->发生回发,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)
通过遵循这些面包屑,您将很快识别页面生命周期的进展顺序。