如何将数据库中的数据放入隐藏字段?

How do I put data from database to hidden field?

我调用存储过程,然后将给定数据存储在此数据表变量中

DataTable data = CallToSP();

在这个 DataTable 中有 3 列 -> CustomerId, CustomerName, CustomerSecondaryId;

我正在显示其中两个 -> CustomerIdCustomerName.

我的目标是在 .aspx 文件中创建一个隐藏字段并从 CodeBehind 获取它的值。 我不清楚的是我不明白数据是如何映射的。

我目前正在从事的项目使用 TelerikUI。它有 RadGrid。

RadGridViewCustomer.DataSource = data;
RadGridViewCustomer.DataBind();
foreach (GridDataItem dataItem in RadGridViewCustomer.MasterTableView.Items)
{
    PutDataInGridView(dataItem); //At some point in this method, I need to take CustomerSecondaryId
}

我试着把它放在 aspx 中,但它说它不是已知元素

<telerik:GridClientSelectColumn UniqueName="CustomerSecondaryId" Visible="false" />

计划像这样从 CodeBehind 获取数据:

string customerSecondaryId = dataItem["CustomerSecondaryId"].Text;

因此,我每次为每个 dataItem 得到 "  ;"

我不想使用 DataRowCollection。我只想将数据放在隐藏字段中,并在需要时获取它的价值。有什么想法吗?

嗯,我没有使用 telerick 网格,但我打赌它遵循 GridView 和 listview。

非常常见的目标是显示一些数据,但不必从数据库中公开 PK id。

然而,GridView 和 Listview 都有针对此需求的内置规定(易于获取,抓取数据的 PK 行,但不公开该 PK ID。

asp.net 转发器没有这种所需的能力,但是有一些很酷的技巧可以从转发器获取 PK 或行 ID,并且不必再次将 PK id 发送到客户端, 也不暴露它。

所以,让我们做一个非常简单的例子

 SELECT ID, HotelName, City, Province, Description, Active

所以,我们想显示(发送)给客户端说酒店名称、城市、省份,但说我们点击一​​行,并想获取酒店行的 PK id? (很普遍的需求)。

所以,我们放入一个网格,并有这个标记:

(让我们放下一个用于行点击的平面简 asp.net 按钮)。 (我实际上更喜欢 listview,因为它允许 plane jane asp.net 控制网格而无需设置愚蠢的“模板”标签 - 但让我们使用 GridView。

所以,我们有这个标记:

    <div style="width:50%;padding:25px">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="ID" CssClass="table">
            <Columns>
                <asp:BoundField DataField="HotelName" HeaderText="HotelName" ItemStyle-Width="200"       />
                <asp:BoundField DataField="City" HeaderText="City"                   />
                <asp:BoundField DataField="Province" HeaderText="Province"           />
                <asp:BoundField DataField="Description" HeaderText="Description"     />
                <asp:CheckBoxField DataField="Active" HeaderText="Active"            />

                <asp:TemplateField HeaderText="Select">
                    <ItemTemplate>
                        <asp:Button ID="cmdRowFun" runat="server" Text="Row Click" OnClick="cmdRowFun_Click" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
     </div>

此代码用于填充网格:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadGrid
    End If

End Sub

Sub LoadGrid()

    Using cmdSQL As _
        New SqlCommand("SELECT ID, HotelName, City, Province, Description, Active FROM tblHotels " &
                       "ORDER BY HotelName",
        New SqlConnection(My.Settings.TEST4))

        cmdSQL.Connection.Open()
        GridView1.DataSource = cmdSQL.ExecuteReader
        GridView1.DataBind()

    End Using

End Sub

输出:

好的,现在行单击按钮:

Protected Sub cmdRowFun_Click(sender As Object, e As EventArgs)

    Dim btn As Button = sender

    Dim gRow As GridViewRow = btn.Parent.Parent
    Dim intPK As Integer

    intPK = GridView1.DataKeys(gRow.RowIndex).Item("ID")

    Debug.Print("Row clicked = " & gRow.RowIndex)
    Debug.Print("PK Value    = " & intPK)
    Debug.Print("Hotel = " & gRow.Cells(0).Text)

End Sub

一行点击的输出:

Row clicked = 1
PK Value    = 72
Hotel = Banff Rocky Mountain Resort

所以,我们点击了网格行。我们现在可以启动一个表格或其他任何东西,并提取整个记录以编辑表格或其他任何东西。

因此,我们点击了该行。

从中我们可以得到行索引。

据此我们get/grab 控制具有行索引的 DataKeys,从而获得 PK 值。

请注意名为 DataKeyNames 的设置。

所以,我们从来没有公开 PK 客户端。

您当然可以包含一个隐藏字段,甚至可以构成按钮的(假)属性,然后执行此操作:

    <asp:Button ID="cmdRowFun" runat="server" Text="Row Click" 
       OnClick="cmdRowFun_Click"
       MyPK = '<%# Eval("ID") %>'
     />

所以,现在我们PK了:

Dim btn As Button = sender
Debug.Print("Pk value = " & btn.Attributes.Item("MyPK").ToString)

因此,您可以将 PK 值添加到按钮、标签甚至只是网格中的隐藏字段。你甚至可以将属性添加到我放入网格中的按钮。

现在,当然在最后一个示例中,您将 PK id 公开给客户端浏览器。我想在某些情况下,这可能无关紧要,但作为一般规则,我尽量避免在客户端标记中完全暴露或暴露数据库 PK id,甚至要求避免数据库 PK id。这是一个你应该避免的大安全问题。

您必须查看 telerick 文档,但我怀疑他们有某种 DataKeys 集合是其网格控件的一部分,因为 GridView 和 ListView 都具有此功能 - 并且它完全针对您的问题而设计。

那个问题是显示数据,但不显示 PK 值,实际上什至不必将其包含在呈现给浏览器客户端的标记中。