2009-08-26 16 views
28

Attualmente sto riscontrando un problema con i pulsanti di opzione e il raggruppamento. Ho un pulsante radio asp all'interno di un controllo ripetitore. Ho l'attributo del nome del gruppo impostato su "Cliente". Quando la pagina viene caricata, i pulsanti radio non sono raggruppati. Invece dei campi ID impostati sul nome del gruppo, sta impostando i campi valore dei pulsanti radio. So che ho provato a impostare i pulsanti radio al di fuori di un controllo ripetitore e ho avuto lo stesso problema. Che cosa sta succedendo qui?raggruppamento pulsante di opzione 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> 

output 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

Quale versione di ASP.Net è questo? – CAbbott

+0

I RadioButton verranno raggruppati se i loro campi "nome", non "ID", sono identici. –

+0

Nonostante il tuo commento su ciò che accade al di fuori di un ripetitore, penso che questo particolare problema sia strettamente collegato all'uso del ripetitore, come notato da CAbbott. Potresti prendere in considerazione la possibilità di modificare il titolo della tua domanda per riflettere questo, se scopri che questo è effettivamente il caso. – Beska

risposta

46

ho finalmente ottenuto intorno a questo con la creazione di un pulsante di scelta semplice e impostando il valore utilizzando un eval lato server.

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

Ora, quando l'applicazione esegue un postback, controllo per il valore di Request.Form [ "radCustomer"]. Funziona perfettamente.

+1

Se è necessaria la funzionalità AutoPostback? – Sam

+0

Non riuscivo a farlo perché avevo bisogno di

+0

Non esattamente perfettamente - quando il modulo non passa una sorta di convalida, quindi dopo il postback la radio i pulsanti non sono selezionati, in altre parole: la scelta non viene salvata tra i postback. –

0

Vorrei iniziare con l'aggiunta di un valore sul mio radiobutton Valore = '<% # Eval ("CustomerNumber")%>' .

+0

Non esiste un attributo valore per il controllo pulsante di selezione asp. – fizch

+0

Probabilmente intendeva la proprietà 'Testo'. ;) –

+0

Questo è un no go. Sapevo che avrebbe solo aggiunto un'etichetta, ma ho pensato che l'avrei provato comunque. – fizch

19

Sfortunatamente, questo è un pozzo known issue with radio buttons within a repeater. Una delle tue uniche opzioni sarebbe quella di creare un controllo server personalizzato derivato dalla classe RadioButton e sovrascrivere il modo in cui esegue il rendering.

EDIT: Ecco un esempio di ciò che la classe derivata può apparire come:

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

Wow. Questo è un bel buco nella funzionalità. Bleh. – Beska

+1

Si basa sull'idea che si possa avere un gruppo di pulsanti radio all'interno di un modello di elemento del ripetitore (più pulsanti di opzione sulla stessa riga). In tal caso, si vorrebbe un raggruppamento univoco basato sull'ID mascherato, ma la maggior parte delle volte le persone vogliono ciò che l'OP ha cercato di fare. – CAbbott

+2

Il tag '' si chiude automaticamente e non deve contenere un tag di chiusura e del testo. Il testo con esso dovrebbe essere in un tag '

9

ho risolto in javascript

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

In questo "funziona" c'è molto potenziale per la confusione qui. Se stai davvero andando con questo metodo, assicurati di documentare HEAVILY cosa sta succedendo. –

3

ho avuto gli stessi problemi. Sto usando Literal come segnaposto per il rendering del pulsante di opzione sull'evento ItemCreated.

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

Si noti che è necessario specificare l'attributo nome (e non solo l'id) per i pulsanti radio da visualizzare in Request.Form sul postback! –

0

ho fatto il mio radiobutton hanno AutoPostBack impostata su true, e poi nel gestore di eventi impostare tutti gli altri pulsanti di opzione per BE non selezionato.

Non ideale, ma ho bisogno di molto controllo sulla visibilità e sugli attributi abilitati del radiobutton, e sembrava più semplice lasciare che ASP.NET controllasse piuttosto che ricorrere allo script lato client.

2

ho dovuto modificare un po 'la risposta postato sopra per r3dsky.

Ecco cosa ha funzionato per me:

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

ho fatto questo:

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

Perché? perché se sostituisci la proprietà name per ogni stringa che desideri, otterrai un 'errore non trovato'. Quindi, è necessario ottenere il nome del primo radiobutton e rinominare tutti con quel nome. Funziona come uno sharm;)

0

La mia soluzione, simile ad altri:

<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(); 
}); 
Problemi correlati