【问题标题】:Bound value to a hiddenfield inside a datalist is not specific to an item绑定到数据列表中隐藏字段的值不是特定于项目
【发布时间】:2013-04-02 03:12:37
【问题描述】:

我是 asp.net(C#) 的初学者,我正在开发一个社交网络应用程序。我一直停留在状态更新和评论部分。我希望在加载页面时,所有线程(状态)都应该在数据列表内的隐藏字段中具有它们的 ID,因为我已经为状态创建了一个 ItemTemplate 并将 Thread_ID 分配给隐藏字段。但问题是隐藏字段对于不同的项目没有不同的值。我不知道我在哪里做错了。请帮帮我。

这里是datalist的代码:

<asp:DataList ID="DataListStatus" runat="server" RepeatColumns="1"
            onitemdatabound="DataListStatus_ItemDataBound"
            onitemcommand="DataListStatus_ItemCommand">
        <ItemTemplate>
            <table width="550px">
                <tr><asp:HiddenField ID="HFieldThreadID" Value='<%#Eval("Thread_ID") %>' runat="server" />
                    <td style="vertical-align:top; width:50px;" align="left" rowspan="3"><a href='UserProfile.aspx?loginid=<%#Eval("RegID")%>' ><img alt="Propic" src="../Images/ProPic.jpg" width="50px" height="50px" /></a></td>
                    <td style="vertical-align:top; width:250px;" align="left"><a href='UserProfile.aspx?loginid=<%#Eval("RegID")%>' ><%#Eval("RegID")%></a></td>
                    <td style="vertical-align:top; width:250px;" align="right"><%#Eval("St_Time") %></td>
                </tr>
    </table>
  </ItemTemplate>
</asp:DataList>

下面是代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        da.SelectCommand = new SqlCommand("SELECT * FROM Status where RegID='" + Session["user"].ToString() + "'", con);
        con.Open();
        da.Fill(ds, "status");
        con.Close();
        DataListStatus.DataSource = ds.Tables["status"];
        DataListStatus.DataBind();
    }

}

在这里,我在 cmets 的内部数据列表中使用隐藏字段的值:

protected void DataListStatus_ItemDataBound(object sender, DataListItemEventArgs e)
{
    da.SelectCommand = new SqlCommand("SELECT * FROM Comment WHERE Thread_ID='" +      ((HiddenField)e.Item.FindControl("HFieldThreadID")).Value + "'", con);
    con.Open();
    da.Fill(ds, "cmts");
    con.Close();
    ((DataList)e.Item.FindControl("DataListCmt")).DataSource = ds.Tables["cmts"];
    ((DataList)e.Item.FindControl("DataListCmt")).DataBind();
}

【问题讨论】:

    标签: c# asp.net datalist hiddenfield


    【解决方案1】:

    我在 ItemDataBound 中注意到的一件事是,在搜索和绑定项目内的控件之前,您要确保 e.Item is 的类型为 ItemAlternatingItem

    注意:请使用参数化查询以避免 SQL 注入。

    protected void DataListStatus_ItemDataBound(object sender, DataListItemEventArgs e)
    {
       if (e.Item.ItemType == ListItemType.Item || 
          e.Item.ItemType == ListItemType.AlternatingItem)
       {
        da.SelectCommand = new SqlCommand("SELECT * FROM Comment WHERE Thread_ID='" +      ((HiddenField)e.Item.FindControl("HFieldThreadID")).Value + "'", con);
        con.Open();
        da.Fill(ds, "cmts");
        con.Close();
        var dataList = (DataList)e.Item.FindControl("DataListCmt");
        dataList.DataSource = ds.Tables["cmts"];
        dataList.DataBind();
       }
    }
    

    【讨论】:

    • 我不知道你的建议对我的代码有什么影响。你能告诉我这个检查 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 做什么?顺便说一句,我犯了其他一些错误。在将数据集分配给下一个线程之前,我没有清除数据集,这就是为什么我觉得隐藏字段的值是相同的。谢谢你的回答。
    • 注意:请使用参数化查询以避免 SQL 注入。非常感谢这个建议。其实我知道这一点,但我觉得这有点困难和乏味,所以我可以稍后再做。这样可以解决另一个问题,即插入单引号(')。
    【解决方案2】:

    不要使用隐藏字段。因为页面加载时这个隐藏字段被清除了,所以请使用标签控件并在标签控件中设置visible="false"。

    并且必须在页面加载事件中调用 !IsPostBack 内部的 DataList 绑定方法

    【讨论】:

    • hidden-field field was cleared on page load time不正确,因为HiddenField 具有视图状态。 HiddenField 中存储的值在回发之间持续存在。
    • DataList binding method 在@Don 的代码中是正确的,因为它是嵌套数据列表
    • @Win 是对的。还有一件事我想使用回传代码一次又一次地执行,所以我不能将数据绑定方法放在!IsnotpostBack 中。顺便说一句,感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2014-11-08
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多