ASP.NET 绑定超链接作为 SQL 服务器存储过程参数?
ASP.NET bound hyperlink as SQL Server stored procedure parameter?
我目前有一个填充有摘要数据的网格视图。我从标记为 ticket_num
的绑定字段创建了一个 hyperlink。我想要完成的是单击 hyperlink 并调用存储过程。我需要将那个 hyperlink 的文本传递到 SQL 服务器中的存储过程。所以流程是这样的...
- 用户点击link
- 那个 hyperlink 的文本被传递到参数中供 SQL 服务器存储过程使用
- 调用存储过程并在新页面显示结果
有什么想法吗?创建存储过程,创建通过 ASP.NET 到服务器的连接。到目前为止一切正常,但我无法弄清楚这一部分。
好吧,既然你想要执行一些代码,那么就没有理由使用 hyper-link,因为那不是你需要的,也不是你想要的。
你不提你是否更喜欢“隐藏”URL 和 hyper link? (通常出于安全考虑,这并不是一个坏主意)。
所以,如果你需要hide/not show/don不想要网格中的值,那么我们简单的按钮点击就可以得到网格的行id(也是隐藏的),然后获取值,然后传递给 sql 服务器。
或者,您可以向按钮添加 URL 或向按钮添加值 - 只需使用命令参数。这样您就不必根据行 PK id 再次访问数据库。
所以,这是一个简单的网格。我将 URL 作为网格上的一行,但也可以将其 shove/put 放入按钮中,以便您了解其工作原理。
所以,简单的网格:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ID" CssClass="table" >
<Columns>
<asp:BoundField DataField="Fighter" HeaderText="Fighter" />
<asp:BoundField DataField="Engine" HeaderText="Engine" />
<asp:BoundField DataField="Thrust" HeaderText="Thrust" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Preview">
<ItemTemplate>
<asp:Image ID="Image2" runat="server" ImageUrl = '<%# Eval("ImagePath") %>' Width="140" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="View">
<ItemTemplate>
<asp:Button ID="cmdView" runat="server" Text="View" CssClass="btn"
CommandArgument = '<%# Eval("ImagePath") %>' OnClick="cmdView_Click" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我们的代码加载上面的代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGridF()
End If
End Sub
Sub LoadGridF()
Using conn As New SqlConnection(My.Settings.TEST4)
Using cmdSQL As New SqlCommand("SELECT * FROM Fighters", conn)
conn.Open()
Dim rstData = New DataTable
rstData.Load(cmdSQL.ExecuteReader)
GridView1.DataSource = rstData
GridView1.DataBind()
End Using
End Using
End Sub
现在我们有了这个:
请注意我们如何拥有 PLAIN JANE 按钮 - 毕竟,它并不是我们真正需要的超级 link,是吗?
所以,对于我们的按钮点击事件,我们有这个:
Protected Sub cmdView_Click(sender As Object, e As EventArgs)
Dim btn As Button = sender
Dim gRow As GridViewRow = btn.NamingContainer
Debug.Print("Row index click = " & gRow.RowIndex)
' get database row PK id
Dim iPK As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")
' now we have database row PK - walk the dog, do payroll processing
' do ANYTHING we want like get the database row etc.
Debug.Print("Data base row PK id = " & iPK)
Debug.Print("Command button arugment = " & btn.CommandArgument)
End Sub
然后输出是:
所以,你可以看到,我们不需要(或者想要一个超级link),而是一个简单的按钮,那个点击事件可以:
get any value from the given grid row
get the database PK id (hidden - never exposed to client side (good security).
get the row click index
get parameters passed to button
我们可以使用 gRows.Cells() 获取其他行值(对于数据字段)
当然还有 gRow.FindControl("ctrl name") 模板列。
我目前有一个填充有摘要数据的网格视图。我从标记为 ticket_num
的绑定字段创建了一个 hyperlink。我想要完成的是单击 hyperlink 并调用存储过程。我需要将那个 hyperlink 的文本传递到 SQL 服务器中的存储过程。所以流程是这样的...
- 用户点击link
- 那个 hyperlink 的文本被传递到参数中供 SQL 服务器存储过程使用
- 调用存储过程并在新页面显示结果
有什么想法吗?创建存储过程,创建通过 ASP.NET 到服务器的连接。到目前为止一切正常,但我无法弄清楚这一部分。
好吧,既然你想要执行一些代码,那么就没有理由使用 hyper-link,因为那不是你需要的,也不是你想要的。
你不提你是否更喜欢“隐藏”URL 和 hyper link? (通常出于安全考虑,这并不是一个坏主意)。
所以,如果你需要hide/not show/don不想要网格中的值,那么我们简单的按钮点击就可以得到网格的行id(也是隐藏的),然后获取值,然后传递给 sql 服务器。
或者,您可以向按钮添加 URL 或向按钮添加值 - 只需使用命令参数。这样您就不必根据行 PK id 再次访问数据库。
所以,这是一个简单的网格。我将 URL 作为网格上的一行,但也可以将其 shove/put 放入按钮中,以便您了解其工作原理。
所以,简单的网格:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ID" CssClass="table" >
<Columns>
<asp:BoundField DataField="Fighter" HeaderText="Fighter" />
<asp:BoundField DataField="Engine" HeaderText="Engine" />
<asp:BoundField DataField="Thrust" HeaderText="Thrust" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="Preview">
<ItemTemplate>
<asp:Image ID="Image2" runat="server" ImageUrl = '<%# Eval("ImagePath") %>' Width="140" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="View">
<ItemTemplate>
<asp:Button ID="cmdView" runat="server" Text="View" CssClass="btn"
CommandArgument = '<%# Eval("ImagePath") %>' OnClick="cmdView_Click" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我们的代码加载上面的代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGridF()
End If
End Sub
Sub LoadGridF()
Using conn As New SqlConnection(My.Settings.TEST4)
Using cmdSQL As New SqlCommand("SELECT * FROM Fighters", conn)
conn.Open()
Dim rstData = New DataTable
rstData.Load(cmdSQL.ExecuteReader)
GridView1.DataSource = rstData
GridView1.DataBind()
End Using
End Using
End Sub
现在我们有了这个:
请注意我们如何拥有 PLAIN JANE 按钮 - 毕竟,它并不是我们真正需要的超级 link,是吗?
所以,对于我们的按钮点击事件,我们有这个:
Protected Sub cmdView_Click(sender As Object, e As EventArgs)
Dim btn As Button = sender
Dim gRow As GridViewRow = btn.NamingContainer
Debug.Print("Row index click = " & gRow.RowIndex)
' get database row PK id
Dim iPK As Integer = GridView1.DataKeys(gRow.RowIndex).Item("ID")
' now we have database row PK - walk the dog, do payroll processing
' do ANYTHING we want like get the database row etc.
Debug.Print("Data base row PK id = " & iPK)
Debug.Print("Command button arugment = " & btn.CommandArgument)
End Sub
然后输出是:
所以,你可以看到,我们不需要(或者想要一个超级link),而是一个简单的按钮,那个点击事件可以:
get any value from the given grid row
get the database PK id (hidden - never exposed to client side (good security).
get the row click index
get parameters passed to button
我们可以使用 gRows.Cells() 获取其他行值(对于数据字段)
当然还有 gRow.FindControl("ctrl name") 模板列。