【问题标题】:ASP.NET: How do I handle a click event from a <a> element within a literal.text?ASP.NET:如何处理来自 literal.text 中的 <a> 元素的单击事件?
【发布时间】:2012-02-09 17:06:03
【问题描述】:

我正在创建&lt;div&gt; 并将它们附加到文字的文本属性中。我在文本中添加了&lt;a&gt; 元素,以便用户可以单击特定元素。如何将它与处理代码隐藏 (vb.net) 中事件的函数联系起来?

我的 Literal.Text 示例 ...

    For Each row As DataRow In oDataTable.Rows
       MyLiteral.Text &= "<div style='font-size: 8.25px; text-transform:uppercase; padding:3px; background: #FF8C00; border: 1px solid #000; margin: 0 5px 0 5px; display:inline-block; float: left;'>" _
                         & row.Item("LastName") & " | <a href='#?"& row.Item("ID") & "' style='color: #000;' >X</a></div>"
    Next

所以上面的代码我想以某种方式允许用户点击 X 链接,然后它会删除那个人。

编辑:如果有更好的方法来做这件事,那也太好了!谢谢。

【问题讨论】:

    标签: asp.net vb.net onclick literals


    【解决方案1】:

    为什么不改用 asp:Repeater 控件。从那里您可以将 asp:LinkBut​​ton 添加到转发器模板并捕获回帖。 Repeater 控件的设计目的与您对循环执行的操作相同,即创建用于数据收集的模板。这将允许使用带有 runat="server" 的控件来处理回发事件。

    以下是一些讨论使用中继器的页面:

    http://www.aspnettutorials.com/tutorials/controls/repeater-vb.aspx

    http://www.dotnetcurry.com/ShowArticle.aspx?ID=663

    您可能希望使用 OnItemDataBound 事件来处理 runat="server" 的控件:

    fetching values from the repeater control in ItemDataBound event

    http://www.codeguru.com/csharp/.net/net_asp/tutorials/article.php/c12065

    以及关于如何处理按钮点击回发事件的文章:

    button event in nested repeater

    ASP.Net: why is my button's click/command events not binding/firing in a repeater?

    我的 VB.NET 生锈了,但我很乐意帮助您解决您可能遇到的任何问题。

    编辑 - 添加代码示例

    我的中继器:

    <asp:Repeater runat="server" ID="repTemplate">
        <ItemTemplate>
            <div>
               <%# DataBinder.Eval(Container.DataItem, "Key")%> - <%# DataBinder.Eval(Container.DataItem, "Value") %>
               <asp:LinkButton OnClick="RepeaterLinkButton1_Click" runat="server" ID="linkDelete" Text="X" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "Key") %>' />
            </div>
        </ItemTemplate>
    </asp:Repeater>
    

    以及页面后面的代码

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
    
        If IsPostBack = False Then
    
            Dim data As Dictionary(Of Integer, String) = New Dictionary(Of Integer, String)()
    
            data.Add(1, "Test #1")
            data.Add(2, "Test #2")
            data.Add(3, "Test #3")
            data.Add(4, "Test #4")
            data.Add(5, "Test #5")
    
            Me.repTemplate.DataSource = data
            Me.repTemplate.DataBind()
    
        End If
    
    End Sub
    
    Protected Sub RepeaterLinkButton1_Click(sender As Object, e As EventArgs)
    
        Dim linkButton As LinkButton = sender
        Dim id As String = linkButton.CommandArgument
    
        'TODO: Delete from the database based on ID
        'TODO: Reload the data to the repeater
    
    End Sub
    

    通过在代码的 HTML 视图中设置 OnClick 函数并将 CommandArgument 设置为 ID,您可以捕获行的 ID 并执行您想要的任何操作。请记住,我的示例以数据字典为例,因此“键”是项目的唯一键,“值”是存储在其中的内容,这就是 HTML 使用“键”的原因/ “值”名称。

    【讨论】:

    • 谢谢!我要试试这个,看看它是否能解决我的问题!
    • 它工作正常,但我无法触发链接按钮的点击事件......但我很感激为我指出正确的方向!在我弄清楚最后一点之后,中继器应该会工作得更好。谢谢!
    【解决方案2】:

    您可以使用超链接控件

    HyperLink hl1 = new HyperLink();
    hl1.Text="Click Here";
    hl1.NavigateUrl="http://www.google.com";
    

    【讨论】:

    • 是否可以让它只触发代码隐藏中的一个函数而不是去一个页面?
    • 使用超链接,不,但使用链接按钮,是的。它比这更复杂一些,因为您试图将 HTML 附加到文字。切换到Repeater、PlaceHolder 或Panel,您将能够将控件(如LinkBut​​ton 和HyperLink)添加到容器中。有关中继器的信息,请参阅下面的答案。
    猜你喜欢
    • 2016-12-17
    • 2016-05-12
    • 2012-08-16
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多