2011-10-10 31 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