我有Repeater
这样的
<asp:Repeater runat="server" DataSourceID="HeaderFooterSqlDataSource">
<HeaderTemplate>
<table border="0" width="100%">
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<input runat="server" id="SelectRadio" type="radio"
name="HeaderFooter" onclick='SelectAndSetHeaderFooter(this);" %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
现在,当这个Repeater
被呈现时,name
的{{1}}属性会自动生成,但我的转发器中所有单选按钮的名称属性应该相同,以便它们可以像一组&amp;根据该组中的其他元素自动检查/取消选中,那么我该如何克服这种情况?
修改
我自己解决了这个问题,实际上我已将输入无线电控制定义为input radio "SelectRadio"
,因为我认为runat="server"
绑定不起作用但我错了Eval()
绑定确实有效没有Eval()
,所以当我删除该属性名称时,并不会自动生成,现在一切都很好,但是对于所有人来说,为了我的问题而节省时间。
答案 0 :(得分:1)
您应该使用内置的RaidoButtonList控件,而不是黑客攻击。
<asp:RadioButtonList id="RadioButtonList1" runat="server">
<asp:ListItem>Item 1</asp:ListItem>
<asp:ListItem>Item 2</asp:ListItem>
<asp:ListItem>Item 3</asp:ListItem>
<asp:ListItem>Item 4</asp:ListItem>
<asp:ListItem>Item 5</asp:ListItem>
<asp:ListItem>Item 6</asp:ListItem>
</asp:RadioButtonList>
答案 1 :(得分:1)
您想查看asp:RadioButton
控件(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.radiobutton.aspx)。
特别是此控件上的GroupName
属性可用于“指定一组单选按钮以创建互斥的控件集”
粗略地说:
<asp:RadioButton runat="server" id="SelectRadio"
GroupName="HeaderFooter" %>' />
编辑:在这种特殊情况下,似乎GroupName不会执行它的设计目标。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.radiobutton.groupname.aspx最后在社区内容中对它进行了讨论,但归结为它使用当前的NamingContainer作为其名称的一部分,而不仅仅是使用您提供的组名。感谢神秘的user1429080在评论中引起我的注意。
答案 2 :(得分:0)
您的单选按钮不作为一个组的原因是因为您有runat =“server”,这将导致name和id属性在父项ID之前。以下将使单选按钮表现为一个有凝聚力的组(注意缺少runat =“server”):
ascx代码:
<asp:Repeater ID="uxRadioSelections" runat="server">
<HeaderTemplate>
<table border="0" width="300px">
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<input type="radio" value='<%# Eval("Name") %>' name="HeaderFooter" onclick="alert(this.value);"><%# Eval("Name") %></input>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
代码背后的代码:
protected void Page_Load(object sender, EventArgs e)
{
string[] names = new string[] {"Alvin", "Simon", "Theodore"};
uxRadioSelections.DataSource = names.Select(x => new { Name = x });
uxRadioSelections.DataBind();
}
但是,以下内容不会成为一个有凝聚力的小组:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
Test
<asp:Repeater ID="uxRadioSelections" runat="server">
<HeaderTemplate>
<table border="0" width="300px">
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:RadioButton Text='<%#Eval("Name") %>' runat="server" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</asp:Content>
由于您提到的命名约定,这些单独的单选按钮将无法找到彼此。 ASP.NET使用RadioButtonLists来克服这个问题:
ascx代码:
<asp:RadioButtonList ID="uxRadioButtons" runat="server">
</asp:RadioButtonList>
代码背后的代码:
protected void Page_Load(object sender, EventArgs e)
{
string[] names = new string[] {"Alvin", "Simon", "Theodore"};
uxRadioButtons.DataTextField = "Name";
uxRadioButtons.DataValueField = "Name";
uxRadioButtons.DataSource = names.Select(x => new { Name = x });
uxRadioButtons.DataBind();
}
这不会为您提供精细控制,但可以提供对选择的简单服务器端访问。如果您只需要与javascript相关的功能并提高格式灵活性,那么第一种格式(与您提供的格式几乎相同)是您最好的选择。祝你好运!
答案 3 :(得分:0)
另一种选择是将ClientIDMode设置为“static”,将其值设置为指定ID的值。由于它是转发器控件,因此生成的所有项目将具有相同的生成ID。所以你只需设置:
<asp:RadioButton runat="server" id="SelectRadio" GroupName="HeaderFooter" ClientIDMode="static">' />
这意味着所有生成的控件都将具有指定的相同ID,即“SelectRadio”。这可能有问题,也可能没有问题,你应该小心,这正是你想要的。
请注意,ClientIDMode是ASP.Net 4.0的一项功能。更多信息:ClientIDMode in ASP.NET 4.0和此处:MSDN。我希望这会有所帮助。
更新1: 您可以通过之前在StackOverflow上提出的this问题获得更多见解。 (虽然这是jQuery)。