在Asp.Net的Repeater控件中,由于内部控件是动态生成的,那么为了保持各控件的独立不相互混淆,Repeater会自动为内部的各种服务器端控件生成唯一的ID。然而很不幸,RaidoButton的Name属性也不能幸免,而我们知道RaidoButton是通过Name属性进行归组的,也就是说在Repeater控件中的RadioButton失去了最原始的作用——单选。
那么如果我们要实现这个单选应该如何做呢?进过一番百度,我发现网上说可以重新编译Repeater控件,但是这个方法想想就觉得不切实际。还有一种就是通过Javascript把RaidoButton的Name属性强制改为一样的,但这种虽说是可以实现,但是在后台却获取不到他的Checked是否为True了,因而这种方法是外强中干呐。
在一番思考后,终于有了收获,最终的解决方法是:客户端RadioButton + jquery对每次RadioButton的选中事件进行响应 + 在响应事件中将RadioButton的Value属性传值到Hidden服务器端控件
(1)实现RaidoButton单选。
在这里我们使用客户端版的Radio控件,既不包含“runat = server”属性,这样Repeater只是简单地将控件复制到各列。这样我就能保证控件的Name属性一致。
<input name="sel_addr" type="radio" class="radio" value="<%#((BookShop.Model.Orderaddress)Container.DataItem).Id %>" />
(2)在Repeater控件外插入Hidden服务器端控件
<asp:HiddenField ID="HdnSelectedValues" runat="server" />
(3)通过JQuery对每次RaidoButton的点击事件进行响应。
$("input[type=radio]").live("click", function () {
$(".radio").each(function () {
if ($(this).attr("checked") == true) {
value = $(this).val();
}
$("#<%=HdnSelectedValues.ClientID%>").val(value);
})
})
(4)后台通过this.HdnSelectedValues.Value取值
this.HdnSelectedValues.Value
进过上面四步,我就就实现了在radio控件的单选和值的传递。
最终效果