2011-10-10 32 views
1

我需要能够在用户单击我的页面上的控件内生成的单选按钮时触发事件。ASP转发器中控件的事件处理程序

我已经为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上的“正确”或“错误”消息。如果有一种方法可以在没有回传的情况下执行此操作,那么这将是理想的。

任何建议将不胜感激。

+0

老板要求我把重点放在目前该项目的另一部分,我会尽快我可以更新。 – Ortund

回答

0

这里的客户端解决方案简要概述(W/O后回)。使用html单选按钮以及隐藏字段来存储正确的答案。附加单选按钮上的单击事件处理程序,以将该值与来自隐藏字段的值相匹配。

直放站马克 - 达:

<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"]应该告诉用户第二个问题的选择答案 - >“1”:真,“0”:假和空字符串:没有选择)。

明显的缺点是正确的答案存储在html中,所以欺骗系统会更简单。解决方案可以使ajax调用服务器来检查答案是否正确 - 这将需要创建盐渍时间限制的伪随机标记来标识问题(否则用户可以使相同的ajax调用来获得答案)。

0

从中继器外面的中继器切掉你的RadioButton代码,转到设计视图并单击该RadioButton(现在它不包含在中继器中,并且可以为其分配事件处理程序而无需手动输入任何代码)。

当您在DesignView中选择此RadioButton时,在您的proporties选项卡中单击events按钮并单击OnSelectedIndexChanged,这将自动生成eventhandler函数。您必须在此单选按钮上启用自动回复(控件右上角的箭头 - 在设计视图中)。

现在削减这个RadioButton并将其放置在您的中继器。现在,每个单选按钮更改都会导致调用生成的处理函数,您可以将发送者对象转换为RadioButton,并且可以使用SelectedValue属性访问其值。

我试过这个解决方案很多次,但只在C#,所以我很抱歉,如果事情是在VB.NET

不同
+0

这可能使我可以使用预定义的事件处理程序,如“Page_Load”,但它不允许我指定参数或我自己的函数,这是我需要的 – Ortund

+0

我不明白为什么必须指定自己的自定义功能?您可以访问单选按钮,您可以获取用户选择的值并完成所有操作,调用一些自定义函数,将参数传递给它们等。 – Zzz

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