如何将数据库中的数据放入隐藏字段?
How do I put data from database to hidden field?
我调用存储过程,然后将给定数据存储在此数据表变量中
DataTable data = CallToSP();
在这个 DataTable 中有 3 列 -> CustomerId, CustomerName, CustomerSecondaryId;
我正在显示其中两个 -> CustomerId 和 CustomerName.
我的目标是在 .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 值,实际上什至不必将其包含在呈现给浏览器客户端的标记中。
我调用存储过程,然后将给定数据存储在此数据表变量中
DataTable data = CallToSP();
在这个 DataTable 中有 3 列 -> CustomerId, CustomerName, CustomerSecondaryId;
我正在显示其中两个 -> CustomerId 和 CustomerName.
我的目标是在 .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 值,实际上什至不必将其包含在呈现给浏览器客户端的标记中。