我在ASP.NET 2.0中有一个Web应用程序,我需要有一个高度自定义的网格。网格中的一列包含每行的单选按钮。
我将其作为Repeater
控件实现,每个div
都有ItemTemplate
。问题是单选按钮(ASP:RadioButton
标签)没有像他们应该那样分组;选择其中一个并不会取消选择其余部分。我已经在它们上设置了GroupName
属性,但是我没有看到通过Firebug在HTML中进行渲染。谷歌搜索tells me,<input type='radio>
上的“name”属性决定了它的组成员资格,但ASP已经将其用作某种唯一标识符。渲染为HTML时,每个单选按钮看起来都是这样的:
<input id="{asp_garbage_naming}_ctl01_rbFoo" type="radio"
name="ctl03$controlName$otherControlName$ctl01$name"
value="rbHost" checked="checked" />
有没有办法让这项工作?或者我将不得不自己提供单选按钮行为(javascript等)?
答案 0 :(得分:1)
一位同事遇到了这个问题并实施了一个jQuery解决方案。这是摘录:
这给了我想要的单选按钮功能,但它阻止我在回发时获得所选的单选按钮。所以我决定手动实现单选按钮功能。
var radios = $("input:radio");
radios.click(function() {
radios.removeAttr('checked');
$(this).attr('checked', 'checked');
return true;
});
这给了我正确的功能,我仍然可以在回发时获得所选的单选按钮和文本框。可能不是最优雅的解决方案,但我找不到任何其他方法来做到这一点。
答案 1 :(得分:1)
在服务器端执行以下操作:
protected void rptRepeaterName_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
RadioButton rdbRadioButtonName = e.Item.FindControl("rdbRadioButtonName") as RadioButton;
Repeater rptRepeaterName = sender as Repeater;
rdbRadioButtonName.Attributes.Add("onclick", string.Format("return radioSelected('{0}', '{1}')", rptRepeaterName.ClientID, rdbRadioButtonName.ClientID));
}
在javascript中执行以下操作
function radioSelected(rptpricelevel, rdbPriceLevel)
{
for (cnt = 0; cnt<100; cnt++)
{
var rdbId = rptpricelevel;
if(cnt < 10)
{
rdbId = + '_ctl0' + cnt + '_rdbRadioButtonName';
}
else
{
rdbId = + '_ctl' + cnt + '_rdbRadioButtonName';
}
var rdb = document.getElementById(rdbId);
if(rdb != null)
{
if(rdbId != rdbPriceLevel)
{
rdb.checked = false;
}
}
}
}
答案 2 :(得分:0)
的问题?您是否需要这些单选按钮作为服务器控件(即您是否需要runat = server标签)?如果没有,您可以在列上使用常规html单选按钮,并使用<%#Eval("Property")%>
语法将任何属性绑定到该列。只是一个想法