当用户点击我页面上的控件中生成的单选按钮时,我需要能够触发事件。
我在RadioButtonList中添加了一个OnSelectedIndexChanged
处理程序,并在我的代码后面创建了一个函数,它应该处理RadioButtonList的ListItems的选择,但我不知道如何将值传递给该函数。
这是我的代码:
<asp:Repeater runat="server" ID="rptQuestions">
<HeaderTemplate><table width="100%"></HeaderTemplate>
<ItemTemplate>
<tr>
<td colspan="2"><%# Container.DataItem("QuestionText")%></td>
</tr>
<tr>
<td>
<asp:RadioButtonList runat="server" ID="rblAnswerSelection" RepeatDirection="Horizontal" AutoPostBack="true" OnSelectedIndexChanged="CheckAnswer">
<asp:ListItem Text="True" Value="1"></asp:ListItem>
<asp:ListItem Text="False" Value="0"></asp:ListItem>
</asp:RadioButtonList>
<asp:Label runat="server" ID="lblCorrectAnswer" Text="<%#Container.DataItem("CorrectAnswer") %>"></asp:Label>
</td>
<td><asp:Label runat="server" ID="lblResult"></asp:Label></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
Private Function CheckAnswer(ByVal SelectedAnswer As Integer) As Boolean
Select Case SelectedAnswer
Case 1 ' User answered True
If lblCorrectAnswer.Text = "True" Then
Return True
Else
Return False
End If
Case 0 ' User answered False
If lblCorrectAnswer.Text = "False" Then
Return True
Else
Return False
End If
End Select
End Function
这个想法是告知用户他们选择的答案是否正确。 CheckAnswer
函数的值将确定lblResult
上显示的“正确”或“不正确”消息。如果有一种方法可以在没有PostBack的情况下做到这一点,那么这将是理想的。
任何建议都将不胜感激。
答案 0 :(得分:0)
从转发器外部的转发器切换您的RadioButton代码,转到设计视图并单击该RadioButton(现在它不包含在转发器中,您可以为其分配事件处理程序而无需手动输入任何代码)。
在DesignView中选择此RadioButton时,单击比例选项卡中的事件按钮,然后单击OnSelectedIndexChanged,这将自动生成eventhandler函数。您必须在此radiobutton上启用自动后备(控件右上角的箭头 - 在“设计”视图中)。
现在缩减此RadioButton并将其放入转发器内。现在,每个radiobutton更改都会导致调用生成的处理函数,您可以将发送方对象转换为RadioButton,并且可以使用SelectedValue属性访问其值。
我已多次尝试过此解决方案,但仅限于C#,所以如果VB.NET中存在不同之处,我很抱歉
答案 1 :(得分:0)
以下是客户端解决方案的简要概述(没有回发后)。使用html单选按钮和隐藏字段来存储正确答案。在单选按钮上附加单击事件处理程序,以使该值与隐藏字段中的值匹配。
Repeater Mark-up:
<tr>
<td colspan="2"><%# Container.DataItem("QuestionText")%></td>
</tr>
<tr>
<td class="answerContainer">
<input type="radio" class="option" name='answer_<%# Container.ItemIndex %>' value="1">True
<input type="radio" class="option" name='answer_<%# Container.ItemIndex %>' value="0">False
<input type="hidden" id="correct_answer" value='<%#Container.DataItem("CorrectAnswer") %>' />
</td>
<td>
<span class="result" />
</td>
</tr>
Java脚本(使用jquery):
$(document).ready(function() {
$('td.answerContainer .option').click(function() {
var opt = $(this);
var correctAns = opt.next('#correct_answer');
var result = (opt.val() == correctAns.val()) ? "Correct" : "Incorrect";
opt.parent().next('td').find('.result').html(result);
});
});
免责声明:未经测试的代码
请注意,单选按钮名称后缀为项目索引,以便在服务器端,您可以通过查看请求来读取用户的答案(例如,Request["answer_1"]
的值应该告诉用户选择的答案第二问题 - &gt;“1”:是,“0”:假和空字符串:无选择。
明显的缺点是正确答案存储在html中,因此欺骗系统会更简单。解决方案可以是对服务器进行ajax调用以检查答案是否正确 - 这需要创建盐渍时间限制的伪随机令牌来识别问题(否则用户可以进行相同的ajax调用以获得答案)。
答案 2 :(得分:0)
您不能将Function
用作事件处理程序。它必须是sub
,它需要两个参数。
看一下这个样本。
标记
<asp:Repeater runat="server" ID="rptQuestions">
<HeaderTemplate><table width="100%"></HeaderTemplate>
<ItemTemplate>
<tr>
<td colspan="2"><%# Eval("Name")%></td>
</tr>
<tr>
<td>
<asp:RadioButtonList runat="server"
ID="rblAnswerSelection"
RepeatDirection="Horizontal"
AutoPostBack="true"
OnSelectedIndexChanged="CheckAnswer">
<asp:ListItem Text="True" Value="1"></asp:ListItem>
<asp:ListItem Text="False" Value="0"></asp:ListItem>
</asp:RadioButtonList>
<asp:Label runat="server"
ID="lblCorrectAnswer"
Text='<%#Eval("CorrectAnswer") %>'>
</asp:Label>
</td>
<td><asp:Label runat="server" ID="lblResult"></asp:Label></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
代码隐藏
Public Class Data
Public Property QuestionText As String
Public Property CorrectAnswer As String
End Class
Dim lst As List(Of Data)
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
lst = New List(Of Data)
lst.Add(New Data() With {.QuestionText = "A", .CorrectAnswer = "True"})
lst.Add(New Data() With {.QuestionText = "B", .CorrectAnswer = "False"})
lst.Add(New Data() With {.QuestionText = "C", .CorrectAnswer = "True"})
rptQuestions.DataSource = lst
rptQuestions.DataBind()
End If
End Sub
Protected Sub CheckAnswer(sender As Object, e As System.EventArgs)
Dim rad As RadioButtonList = DirectCast(sender, RadioButtonList)
Dim item As RepeaterItem = DirectCast(rad.Parent, RepeaterItem)
Dim correctAns As Label = DirectCast(item.FindControl("lblCorrectAnswer"), Label)
Dim result As Label = DirectCast(item.FindControl("lblResult"), Label)
Dim SelectedAnswer As String = rad.SelectedItem.Text
If correctAns.Text = SelectedAnswer Then
result.Text = "Correct"
Else
result.Text = "Incorrect"
End If
End Sub