¿Cómo encontrar el botón de radio marcado dentro del elemento repetidor?
-
08-07-2019 - |
Pregunta
Tengo un control Repeater en la página ASPX definido así:
<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>
Para permitir seleccionar solo un botón de radio a tiempo, he usado un formulario de truco este artículo .
Pero ahora, cuando se envía el formulario, quiero determinar qué botón de opción está marcado.
Podría hacer esto:
RadioButton checkedButton = null;
foreach (RepeaterItem item in answerVariantRepeater.Items)
{
RadioButton control=(RadioButton)item.FindControl("answerVariantRadioButton");
if (control.Checked)
{
checkedButton = control;
break;
}
}
pero espero que se pueda hacer de alguna manera más simple (tal vez a través de LINQ a los objetos).
Solución
Dado que ya está utilizando JavaScript para manejar el evento de clic del botón de opción en el cliente, puede actualizar un campo oculto con el valor seleccionado al mismo tiempo.
El código de su servidor solo accedería al valor seleccionado desde el campo oculto.
Otros consejos
Siempre puede usar Request.Form
para obtener el botón de opción enviado:
var value = Request.Form["answerVariants"];
Creo que el valor enviado por defecto es el id del <asp:RadioButton />
que se seleccionó, pero siempre puede agregar un atributo de valor, aunque no sea oficialmente una propiedad <=>, y este será el valor enviado:
<asp:RadioButton ID="answerVariantRadioButton" runat="server"
GroupName="answerVariants"
Text='<%# DataBinder.Eval(Container.DataItem, "Text")%>'"
value='<%# DataBinder.Eval(Container.DataItem, "SomethingToUseAsTheValue")%>' />
Estoy bastante seguro de que lo único que podría usar LINQ to Objects aquí sería tomar las condiciones dentro del bucle foreach y moverlas a una cláusula where.
RadioButton checked =
(from item in answerVariantRepeater.Items
let radioButton = (RadioButton)item.FindControl("answerVariantRadioButton")
where radioButton.Checked
select radioButton).FirstOrDefault();