【问题标题】:RadioButtonList SelectedIndexChanged generic event not firingRadioButtonList SelectedIndexChanged 通用事件未触发
【发布时间】:2012-11-19 19:29:29
【问题描述】:

开发了一个稍微动态的页面,该页面基于数据库中的信息构建了一个问答页面。一切都很好,除了我无法让 RadioButtonList 事件触发一个次要的 MsgBox 响应来验证对象发送者和选定的 ListItem 信息。

Page_Load

    If Not Page.IsPostBack Then
        With Globals.tst

            .GetBrandInformation(Page.RouteData.Values("brand"),
              Page.RouteData.Values("year"),
              Page.RouteData.Values("month"))

            'Load up Question DataSet
            For Each quest As Question In .Questions

                Dim tr As New HtmlControls.HtmlTableRow
                Dim td As New HtmlControls.HtmlTableCell
                td.Attributes.Add("class", "tdQ")       'Add class attribute to <td> element, creating 'class="tdQ"'
                Dim lbl As New Label
                lbl.ID = "lbl" & quest.ID
                lbl.Text = quest.Text

                td.Controls.Add(lbl)
                tr.Cells.Add(td)
                tblContent.Rows.Add(tr)

                tr = New HtmlControls.HtmlTableRow
                td = New HtmlControls.HtmlTableCell
                td.Attributes.Add("class", "tdA")       'Add class attribute to <td> element, creating 'class="tdA"'

                Dim rbl As New RadioButtonList
                rbl.ID = "rblT" & .ID & "_Q" & quest.ID
                AddHandler rbl.SelectedIndexChanged, AddressOf rbl_SelectedIndexChanged     'Attach generic event handler to control

                Dim li As New ListItem

                'Load up Answer Dataset
                For Each answ As Answer In quest.Answers
                    li.Text = answ.Value
                    li.Value = "T" & .ID & "-Q" & quest.ID & "-A" & answ.ID & "-C" & answ.Correct

                    'Add built ListItem to RadioButtonList
                    rbl.Items.Add(li)
                    li = New ListItem
                Next

                td.Controls.Add(rbl)
                tr.Cells.Add(td)
                tblContent.Rows.Add(tr)
            Next

        End With
        '
    End If

下面是我尝试附加到 RadioButtonList(s) 的通用事件处理程序逻辑。

Protected Sub rbl_SelectedIndexChanged(sender As Object, e As EventArgs)
    MsgBox(CType(sender, RadioButtonList).ID & " Clicked.")
    MsgBox("Radio Button Selected: " & CType(sender, RadioButtonList).ID & " is Correct? " & CType(sender, RadioButtonList).SelectedValue)
End Sub

有人发现设计有什么问题,或者知道为什么没有触发事件吗?

2012-11-20 编辑

好的,将rbl 对象更改为AutoPostBack = true,但这让生活变得更加难以忍受;)然后迅速恢复,因为我的问答列表是在问题和答案中随机生成的,因此最终用户将获得每次单击 ListItem 时都会出现新的随机问题顺序。

虽然我从回调中得到了一些响应,但仍然没有通过使用定义的 JavaScript 文件或内联 Response.Write/ClientScript.Register 得到我期望的 JavaScript 响应。

在内容页面中创建了一个调试方法:

Public Shared Sub Show(msg As String, Optional pg As Page = Nothing)
    Dim cmsg As String = msg.Replace("'", "\'")
    Dim scr As String = "<script type=""text/javascript"">alert('" & cmsg & "');</script>"

    If pg Is Nothing Then
        pg = CType(HttpContext.Current.CurrentHandler, Page)
    End If

    If (pg IsNot Nothing) And Not (pg.ClientScript.IsClientScriptBlockRegistered("alert")) Then
        pg.ClientScript.RegisterClientScriptBlock(GetType(Alert), "alert", scr)
    End If
End Sub

在页面加载此方法会按预期触发,但当放置在 SelectedIndexChanged 事件中时,它永远不会触发。

仍然对为什么它适用于一般执行而不是触发执行感到困惑。

为那些喜欢创建实现 Javascript 的 .Net 方法的人提供有用的方法。 .Net Slave - Javascript Alert.Show Class

【问题讨论】:

  • 好吧,我想我已经修好了....马上就会验证,不会出现回发的警报中断。任何人都知道是否有 Javascript 警报窗口的模态形式,因此它不会冻结 PostBack 行为?

标签: asp.net asp.net-4.0


【解决方案1】:

你必须把它从If Not Page.IsPostBack Then中取出

这是因为当您进行回发时,...

    AddHandler rbl.SelectedIndexChanged, AddressOf rbl_SelectedIndexChanged

...需要反弹才能开火。

所以基本上,删除If Not Page.IsPostBack Then 和End If。

哦,还要去掉MsgBox() 代码——这会导致页面无法执行任何操作。如果您想输出Alert(),请执行以下操作:

    Dim script As String = String.Format("alert('{0}');", ""Radio Button Selected: " & CType(sender, RadioButtonList).ID & " is Correct? " & CType(sender, RadioButtonList).SelectedValue")
    page.ClientScript.RegisterClientScriptBlock(page.[GetType](), "alert", script, True)

更新:

您还想在您的 RBL 上设置 AutoPostback = true;。这告诉页面一旦改变就回发。处理程序仅在 AutoPostBack 为真时触发。

【讨论】:

  • MasterPage/ContentPage 会影响这个吗?将构建 ContentPage 主体的逻辑置于 PostBack 逻辑之外,但仍未获得 MsgBox 预期的行为。想知道是否有我缺少的设置。
  • 不,不应该影响它。如果您完全不确定,那么将构建列表的代码放在页面的 preInit 中 - 在其他任何事情完成之前。只是在我的答案中添加了更多内容-MsgBox 可能会杀死您的脚本-它只会挂起;不要使用它。
  • 最终,MsgBox/Alert 仅用于调试目的。在生产中,它将用于在选择信息时跟踪信息。生病实施警报方法。希望远离客户端脚本,但我想我无法摆脱它。
  • 因此,如果它是用于调试,那么只需执行Response.Write("&lt;script&gt;alert('" + YourLongMessage + "');&lt;/script&gt;") 即可快速而肮脏
  • MsgBox 的问题是你要求服务器显示消息——他们并不喜欢这样做,他们更喜欢崩溃:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多