ASP.NET 绑定超链接作为 SQL 服务器存储过程参数?

ASP.NET bound hyperlink as SQL Server stored procedure parameter?

我目前有一个填充有摘要数据的网格视图。我从标记为 ticket_num 的绑定字段创建了一个 hyperlink。我想要完成的是单击 hyperlink 并调用存储过程。我需要将那个 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") 模板列。