回发后 DataList 的 ASP.NET / DataItem 为空

Posted

技术标签:

【中文标题】回发后 DataList 的 ASP.NET / DataItem 为空【英文标题】:ASP.NET / DataItem of DataList is null after Postback 【发布时间】:2011-04-01 16:26:56 【问题描述】:

在我的 ASP.NET 表单中回发(单击按钮)后,我的表单的所有 DataItem 都为空。为什么?即使在回发之后,我应该怎么做才能检索 DataList 的内容?

protected void buttonAddRecord_Click(object sender, EventArgs e)
    
        foreach (DataListItem item in listFields.Items)
        
            // item.DataItem == null  WTF?
        
    

protected void Page_Load(object sender, EventArgs e)
    
        BindFields();
    

private void BindFields()
    
        object setting = MySettings.GetSetting();

        if (!Null.IsNull(setting))
        
            listFields.DataSource =     
                DataProvider.GetData(int.Parse(setting.ToString()));
            listFields.DataBind();
        

        listFields.Visible = listFields.Items.Count > 0;
        emptyMessage.Visible = listFields.Items.Count == 0;
    

【问题讨论】:

【参考方案1】:

找到我的答案here。

John 所说的,数据源项 仅在数据绑定时可用。 之后它们不再可访问 初始加载。

您可能会考虑拥有一个对象或 对象集合表示 更新的屏幕数据 网格,然后从那个持久化更改 到数据库。

更准确地说,我使用 HiddenField 跨帖子存储 ID,并从数据库请求数据,而不是尝试从 DataItem 中获取数据(不能在数据绑定事件之外使用)。强>

HiddenField 控件用于 存储需要的值 跨帖子持久保存到服务器。

【讨论】:

好吧,我没有看到任何其他选择。到目前为止,它运行良好。 HiddenField 为我工作。我正在使用中继器,需要将数据从绑定到按钮点击中持久化。 这听起来像是一种根据需要进行两倍的数据库调用的好方法。似乎 DataList 的模型可能很差。 该链接已过期。【参考方案2】:

DataItem 仅在数据绑定时可用。

Load 出现在 Click 之前,所以无论如何你都在覆盖你的数据。

这样做:

protected void Page_Load(object sender, EventArgs e)

    if (!Page.IsPostBack)
    
        BindFields();
    

您应该使用 DataSource(如 ObjectDataSource)来处理 DataBinding 和更新/插入。

更新/建议:

使用 PlaceHolders 将数据绑定到您会遇到麻烦。您应该考虑使用 ListView、GridView、DataList 或 Repeater。我敢肯定,其中任何一个都可以满足您的要求,并且您将不得不减少编程。花时间学习它们,而不是试图让它发挥作用,它注定会失败。

【讨论】:

我已经在使用 DataList(查看标题)。而且我不得不使用 PlaceHolder,因为我无法提前知道每个字段的 Control 类型。实际上,我的 DataList 的每个 DataListItem 都包含一个 PlaceHolder 控件,该控件将在数据绑定时确定。 那么你在这些占位符中放了什么? 每个占位符包含一个控件,例如TextBox、CheckBox、RadioButtonList、DropDownList等。由于它是动态的,我无法知道确切的控件类型。每个占位符代表表单中的一个字段,例如姓名、地址、电子邮件、喜欢的食物等。 您必须在回发时添加它们,但不要放入数据。在绑定函数中添加一个布尔参数,回发时将其设置为 false。如果为真,则添加控件+数据,如果为假,则仅添加控件并在单击时提取数据。 这行不通,因为回发时无法访问 DataItem。【参考方案3】:

在每次回发后检查您是否真的 DataBind() DataList。通常,当您不再绑定 DataList、GridView、DropDownList(和其他控件)后,您会在 PostBack 之后将它们变为空。

【讨论】:

感谢您的提示,但即使在回发时我也确实重新绑定了 DataList。我还检查了调试器,数据源在回发时绑定。

以上是关于回发后 DataList 的 ASP.NET / DataItem 为空的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 ASP.NET MVC 中回发后模型为空

动态创建的 asp.net 控件在回发后消失

回发后,我的 JavaScript 函数在 ASP.NET 中不起作用

回发后 F5 的 asp.net 问题,因为它做了它应该做的事情

文本框文本在回发后消失

Error-ASP.NET:由于未能找到 id 为“FileUpload1$gvFiles$ctl02$lnkBtnRemoveFile”的控件或在回发后将同一 ID 分配给另一个控件,导致发生错误。