2009-08-26 125 views
28

我目前有一个单选按钮和分组的问题。我有一个中继器控制中的asp单选按钮。我将组名称属性设置为“客户”。加载页面时,单选按钮不分组。它不是将id字段设置为组名,而是设置单选按钮的值字段。我知道我曾尝试在中继控制器之外设置单选按钮,并且遇到同样的问题。这里发生了什么?asp.net单选按钮分组

ASPX

<asp:Repeater ID="repCustomers" runat="server"> 
    <HeaderTemplate> 
     <table class="tableDefault" cellpadding="0" cellspacing="0" border="0" style="width: 383px; border: 0px !important"> 
      <tr> 
       <th>&nbsp;</th> 
       <th>Cust. No.</th> 
       <th>Cust. Name</th> 
      </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
      <tr> 
       <td> 
        <asp:RadioButton ID="radCustomer" GroupName="Customer" runat="server" ValidationGroup="Customer" ToolTip='<%#Eval("CustomerNumber") %>' /> 
       </td> 
       <td><%#Eval("CustomerNumber")%></td> 
       <td><%#Eval("Name") %></td> 
      </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

输出HTML

<table class="tableDefault" cellpadding="0" cellspacing="0" border="0" style="width: 383px; border: 0px !important"> 
    <tr> 
     <th>&nbsp;</th> 
     <th>Cust. No.</th> 
     <th>Cust. Name</th> 
    </tr> 

    <tr> 
     <td> 
      <span title="111111"><input id="ctl00_PrimaryContent_repCustomers_ctl01_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl01$Customer" value="radCustomer" /></span> 
     </td> 
     <td>111111</td> 
     <td>Jeremy's Test</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="222222"><input id="ctl00_PrimaryContent_repCustomers_ctl02_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl02$Customer" value="radCustomer" /></span> 
     </td> 
     <td>222222</td> 
     <td>My Test</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="333333"><input id="ctl00_PrimaryContent_repCustomers_ctl03_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl03$Customer" value="radCustomer" /></span> 
     </td> 
     <td>333333</td> 
     <td>Jim Bob's BBQ</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="444444"><input id="ctl00_PrimaryContent_repCustomers_ctl04_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl04$Customer" value="radCustomer" /></span> 
     </td> 
     <td>444444</td> 
     <td>New Hope Hamburgers</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="555555"><input id="ctl00_PrimaryContent_repCustomers_ctl05_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl05$Customer" value="radCustomer" /></span> 
     </td> 
     <td>555555</td> 
     <td>Pied Piper Pizza</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="666666"><input id="ctl00_PrimaryContent_repCustomers_ctl06_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl06$Customer" value="radCustomer" /></span> 
     </td> 
     <td>666666</td> 
     <td>Sandy's Subs</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="777777"><input id="ctl00_PrimaryContent_repCustomers_ctl07_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl07$Customer" value="radCustomer" /></span> 
     </td> 
     <td>777777</td> 
     <td>Leonard's Lambchops</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="888888"><input id="ctl00_PrimaryContent_repCustomers_ctl08_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl08$Customer" value="radCustomer" /></span> 
     </td> 
     <td>888888</td> 
     <td>Dave's Diamond Deli</td> 
    </tr> 

    <tr> 
     <td> 
      <span title="999999"><input id="ctl00_PrimaryContent_repCustomers_ctl09_radCustomer" type="radio" name="ctl00$PrimaryContent$repCustomers$ctl09$Customer" value="radCustomer" /></span> 
     </td> 
     <td>999999</td> 
     <td>Ernie's Eatery</td> 
    </tr> 

</table> 
+0

什么版本的ASP.Net的这是什么? – CAbbott 2009-08-26 14:17:15

+0

如果RadioButtons的'姓名',而不是'ID',这些字段是相同的。 – 2009-08-26 14:35:49

+0

尽管您对中继器之外发生的这种事情发表了评论,但我认为这个特定问题与您使用中继器的关系非常密切,正如CAbbott所述。如果您发现事实确实如此,您可能需要考虑编辑问题标题以反映此问题。 – Beska 2009-08-26 15:21:29

回答

46

我终于得到了解决此通过创建一个普通的单选按钮,使用服务器端EVAL设定值。现在

<input type="radio" name="radCustomer" value='<%#Eval("CustomerNumber") %>' /> 

在应用程序执行回发,予检查的Request.Form [“radCustomer”]的值。这工作完美无瑕。

+1

如果我们需要AutoPostback功能? – Sam 2014-11-11 17:12:10

+0

我无法做到这一点,因为我需要

+0

不完美无瑕 - 当表单未通过某种验证时,按钮未被选中 - 换句话说:选择不会在回发之间保存。 – 2018-02-09 17:22:31

0

我将通过在我的单选按钮值将值相加后开始= '<%#的eval( “CUSTOMERNUMBER”)%>' 。

+0

asp单选按钮控件没有值属性。 – fizch 2009-08-26 14:19:54

+0

他可能是指“文本”属性。 ;) – 2009-08-26 14:33:34

+0

这是不行的。我知道它只是为它添加一个标签,但我想我会试试它。 – fizch 2009-08-26 14:39:21

19

不幸的是,这是一口井known issue with radio buttons within a repeater。您唯一的选择之一是创建一个从RadioButton类派生的自定义服务器控件,并覆盖它如何呈现。

编辑:这是什么样的派生类可能看起来像一个示例:

public class MyRadioButton : RadioButton 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write("<input id=\"" + base.ClientID + "\" "); 
     writer.Write("type=\"radio\" "); 
     writer.Write("name=\"" + base.ID + "\" "); 
     writer.Write("value=\"" + base.ID + "\" />"); 
     writer.Write("<label for=\"" + base.ClientID + "\">"); 
     writer.Write(base.Text); 
     writer.Write("</label>"); 
    } 
} 
+9

哇。这是功能上的一个很大的漏洞。的Bleh。 – Beska 2009-08-26 15:17:32

+1

这是基于您可以在中继器的项目模板(同一行上的多个单选按钮)内具有单选按钮组的想法。在这种情况下,您会希望根据损坏的ID进行独特的分组,但大多数时候人们都希望OP尝试做什么。 – CAbbott 2009-08-26 15:32:47

+2

''标签是自动关闭的,它不应该包含结束标签和文本。带有它的文本应该在'

9

我固定它在JavaScript

$(document).ready(function() { 
     $("#divWithGridViewOrRepeater input:radio").attr("name", "yourGroupName"); 
    }); 
+1

这个“有效”的地方有很多混乱的可能性。如果你真的想用这种方法,那么确定你是HEAVILY记录发生了什么。 – 2012-03-08 16:32:35

3

我有同样的问题。我使用文字作为占位符呈现单选按钮onItemCreated事件。

ASP.Net

<asp:Repeater ID="rpt" runat="server" OnItemCreated="rpt_OnItemCreated"> 
    <ItemTemplate> 
     <asp:Literal ID="lit" runat="server"></asp:Literal> 
    </ItemTemplate> 
</asp:Repeater> 

C#

protected void rpt_OnItemCreated(object sender, RepeaterItemEventArgs e) { 
    Literal lit = (Literal)e.Item.FindControl("lit"); 
    lit.Text = "<input type=\"radio\" name=\"myGroup\">"; 
} 
+0

请注意,您必须指定名称属性(而不仅仅是id),以便在回发时在Request.Form中显示单选按钮! – 2012-10-12 07:59:35

0

我做我的单选按钮都自动回设置为true,然后在事件处理程序中设置的所有其他的单选按钮被选中。

不理想,但我需要对单选按钮的可见性和启用属性进行很多控制,而让ASP.NET控制而不是诉诸客户端脚本似乎更容易。

2

我不得不修改小幅r3dsky上面贴了答案。

下面是我工作:

$(document).ready(function() { 
     $(".divWithGridViewOrRepeater input:radio").attr("name", "yourGroupName"); 
    }); 
0

我这样做:

$("input:radio").attr("name", $("input:radio").first().attr("name")); 

为什么?因为如果你替换了你想要的任何字符串的名称属性,你将会得到一个'找不到的错误'。因此,您需要获取第一个单选按钮的名称,并用该名称重命名它们。它像一个沙姆沙伊赫;)

0

我的解决方案,类似于其他:

<input id="ctlRadio" runat="server" type="radio" data-fixgroupbug="1" > 

// Fixes this ASP.NET bug: if radio input is inside repeater you can't set its name. 
// Every input gets set different name by ASP.NET. 
// They don't behave as a group. You can select multiple radios. 
function fixRadiogroupBug() 
{ 
    $('[type="radio"][data-fixgroupbug]').click(function() { 
     $(this).siblings('[type="radio"]').prop('checked', false); 
    }); 
} 

$(document).ready(function() { 
    fixRadiogroupBug(); 
});