ASP.NET:单击链接按钮时触发错误事件



>我有一个"购物车"Repeater,其中每个项目都有几个控件。我们关注的是两个DropDownLists,一个LinkButton和一个TextBox。列表位于一个验证组上,按钮和文本框位于另一个验证组上。

这两个列表都有一个OnSelectedIndexChanged事件处理程序,该处理程序根据两个DropDownLists中的选择进行一些计算。两个列表也有 AutoPostBack="True" .

该按钮有一个OnClick处理程序,该处理程序还根据文本框中的数字进行一些计算。

我需要立即更新计算 - 所以我在每个事件处理程序上为 Repeater 添加了另一个数据绑定

问题是 - 单击其中一个DropDownLists后,我无法从文本框中获取值。它总是显示为 1。在后台,OnSelectedIndexChanged事件处理程序首先触发,按钮OnClick将在它之后触发。这只会在我更改其中一个列表后发生 - 从那一刻起,每次我单击该按钮时都会发生这种情况。在此之前 - 所有控件上一切正常。

你觉得怎么样?下面是一些代码(我希望它不会太多,我包含了参与的所有内容( - 非常感谢!

下面是转发器模板:

                <ItemTemplate>
                    <tr>
                        <td class="size"><div><asp:DropDownList runat="server" ID="_selectSize" AutoPostBack="true" OnSelectedIndexChanged="selectChange" EnableViewState="true" TabIndex="<%#Container.ItemIndex%>" ValidationGroup="doNotValidate"></asp:DropDownList></div></td>
                        <td class="material"><div><asp:DropDownList runat="server" ID="_selectMaterial" AutoPostBack="true" OnSelectedIndexChanged="selectChange" EnableViewState="true" TabIndex="<%#Container.ItemIndex%>" ValidationGroup="doNotValidate"></asp:DropDownList></div></td>
                        <td class="quantity">
                            <div>
                                <div class="quantity_container"><asp:TextBox runat="server" ID="_txtAmount" name="quantity_<%#Container.ItemIndex%>" ValidationGroup="vCart"></asp:TextBox></div>
                                <div><asp:LinkButton runat="server" CssClass="refresh" id="_refreshCart" ValidationGroup="vCart"></asp:LinkButton></div>
                            </div>
                        </td>
                    </tr>
                </ItemTemplate>

Repeater.DataBound()

Protected Sub rptCart_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptCart.ItemDataBound
    If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then
        Dim OrderItem As ProxyMarket.Item = CType(e.Item.DataItem, ProxyMarket.Item)
        Dim btnRemoveProduct As LinkButton = CType(e.Item.FindControl("_removeProduct"), LinkButton)
        Dim btnRefreshCart As LinkButton = CType(e.Item.FindControl("_refreshCart"), LinkButton)
        Dim txtAmount As TextBox = CType(e.Item.FindControl("_txtAmount"), TextBox)
        Dim sizeSelect As DropDownList = CType(e.Item.FindControl("_selectSize"), DropDownList)
        Dim materialSelect As DropDownList = CType(e.Item.FindControl("_selectMaterial"), DropDownList)
        btnRemoveProduct.CommandName = OrderItem.ID
        btnRefreshCart.CommandName = OrderItem.ID
        txtAmount.Text = OrderItem.Units
        AddHandler btnRemoveProduct.Click, AddressOf removeProduct
        AddHandler btnRefreshCart.Click, AddressOf refreshCart
        sizeSelect.DataSource = sizeList
        sizeSelect.DataBind()
        sizeSelect.SelectedIndex = s
        materialSelect.DataSource = materialList
        materialSelect.DataBind()
        materialSelect.SelectedIndex = m
    End If
End Sub

下面是DropDownLists事件处理程序:

Protected Sub selectChange(ByVal sender As DropDownList, ByVal e As System.EventArgs)
    Dim listing As New PriceListing
    Dim ddl As DropDownList
    Dim selectedIndex As Integer
    If sender.ID = "_selectSize" Then
        For Each rptrItem As RepeaterItem In rptCart.Items
            ddl = CType(rptrItem.FindControl("_selectMaterial"), DropDownList)
            If ddl.TabIndex = sender.TabIndex Then Exit For
        Next
        For Each listing In artDecoPricing
            If listing.Size = sender.SelectedValue Then Exit For
        Next
        selectedIndex = ddl.SelectedIndex
        s = sender.SelectedIndex
    ElseIf sender.ID = "_selectMaterial" Then
        For Each rptrItem As RepeaterItem In rptCart.Items
            ddl = CType(rptrItem.FindControl("_selectSize"), DropDownList)
            If ddl.TabIndex = sender.TabIndex Then Exit For
        Next
        For Each listing In artDecoPricing
            If listing.Size = ddl.SelectedValue Then Exit For
        Next
        selectedIndex = sender.SelectedIndex
        s = ddl.SelectedIndex
    End If
    Select Case selectedIndex
        Case 0
            Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Canvas
        Case 1
            Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Acrylic
        Case 2
            Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Framed
        Case 3
            Cart.Order.Items(sender.TabIndex).PriceUnit = listing.Alucobond
    End Select
    Cart.SaveOrder()
    s = sender.SelectedIndex
    m = selectedIndex
    rptCart.DataSource = Cart.Order.Items
    rptCart.DataBind()
End Sub

最后,LinkButton OnClick处理程序:

Protected Sub refreshCart(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim btnRefreshCart As LinkButton = CType(sender, LinkButton)
    Dim amountStr As String
    Dim amount As Integer
    amountStr = CType(btnRefreshCart.Parent.FindControl("_txtAmount"), TextBox).Text
    If IsNumeric(amountStr) Then
        amount = CDbl(amountStr)
    Else
        amount = -1
    End If
    amount = IIf(amount > 0, amount, -30)
    For Each Item As ProxyMarket.Item In Cart.Order.Items
        If Item.ID = btnRefreshCart.CommandName Then
            Item.Units = amount
            Cart.Edit_Product(btnRefreshCart.CommandName, amount)
            Exit For
        End If
    Next
    rptCart.DataSource = Cart.Order.Items
    rptCart.DataBind()
End Sub

谢谢:)

我找到了解决方案!

显然,发生这种情况是因为 ASP.NET 中的视图状态限制导致OnSelectedIndexChanged在Page_Load上触发,而不管用户是否实际选择了不同的值。

因此,当事件处理程序触发时,我正在检查是调用我的DropDownLists还是其他控件 - 防止事件在不需要时触发 - 并保持页面上的所有事件处理完好无损:

Protected Sub selectChange(ByVal sender As DropDownList, ByVal e As System.EventArgs)
    Dim senderClientID = Page.Request.Params.Get("__EVENTTARGET")
    ' Run ONLY if the relevant select control was clicked,
    ' otherwise this is only fired because of ASP.NET limitations,
    ' and will screw up the original event:
    If senderClientID.IndexOf("_selectSize") <> -1 Or senderClientID.IndexOf("_selectMaterial") <> -1 Then
        'do stuff
我知道

这已经得到了回答,但我遇到了一个非常相似的问题,有一个完全不同的解决方案,因为这是谷歌中出现的第一篇文章,我想我会在这里添加它。

我有一个链接按钮,当单击它时,但仅在IE9中,它似乎激活了页面上的另一个按钮并调用它是事件而不是它自己的。

经过多次混乱和谷歌搜索,我意识到激活另一个按钮的不仅仅是我的按钮,而是如果我点击页面特定部分的任何地方。

在完全剥离我的页面后,我最终发现了问题。是这样的:

   <label style="width: 100%" />

空标签标记。删除后一切都很好。

相关内容

  • 没有找到相关文章