【发布时间】: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