Domanda

Ho un controllo Repeater sulla pagina ASPX definito in questo modo:

<asp:Repeater ID="answerVariantRepeater" runat="server"
    onitemdatabound="answerVariantRepeater_ItemDataBound">
    <ItemTemplate>
        <asp:RadioButton ID="answerVariantRadioButton" runat="server"
            GroupName="answerVariants" 
            Text='<%# DataBinder.Eval(Container.DataItem, "Text")%>'"/>
    </ItemTemplate>
</asp:Repeater>

Per consentire la selezione di un solo pulsante di opzione nel tempo, ho usato un trucco questo articolo .

Ma ora quando viene inviato il modulo voglio determinare quale pulsante di opzione è selezionato.

Potrei farlo:

RadioButton checkedButton = null;

foreach (RepeaterItem item in answerVariantRepeater.Items)
{
    RadioButton control=(RadioButton)item.FindControl("answerVariantRadioButton");
    if (control.Checked)
    {
        checkedButton = control;
        break;
    }
}

ma spero che potrebbe essere fatto in qualche modo più semplice (forse tramite LINQ agli oggetti).

È stato utile?

Soluzione

Dato che stai già utilizzando JavaScript per gestire l'evento di clic del pulsante di opzione sul client, puoi aggiornare contemporaneamente un campo nascosto con il valore selezionato.

Il tuo codice server accederà quindi al valore selezionato dal campo nascosto.

Altri suggerimenti

Puoi sempre utilizzare Request.Form per ottenere il pulsante di opzione inviato:

var value = Request.Form["answerVariants"];

Penso che il valore inviato sia impostato per default sull'ID del <asp:RadioButton /> che è stato selezionato, ma puoi sempre aggiungere un attributo valore - anche se non è ufficialmente una proprietà <=> - e questo sarà quindi il valore inviato:

<asp:RadioButton ID="answerVariantRadioButton" runat="server"
    GroupName="answerVariants" 
    Text='<%# DataBinder.Eval(Container.DataItem, "Text")%>'"
    value='<%# DataBinder.Eval(Container.DataItem, "SomethingToUseAsTheValue")%>' />

Sono abbastanza sicuro che l'unica cosa per cui potresti usare LINQ to Objects sarebbe prendere le condizioni dall'interno del ciclo foreach e spostarle in una clausola where.

RadioButton checked = 
    (from item in answerVariantRepeater.Items
    let radioButton = (RadioButton)item.FindControl("answerVariantRadioButton")
    where radioButton.Checked
    select radioButton).FirstOrDefault();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top