ASP Repeater中控件的事件处理程序

时间:2011-10-10 07:13:27

标签: asp.net vb.net

当用户点击我页面上的控件中生成的单选按钮时,我需要能够触发事件。

我在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的情况下做到这一点,那么这将是理想的。

任何建议都将不胜感激。

3 个答案:

答案 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