2009-08-26 7 views
28

Obecnie mam problem z przyciskami radiowymi i grupowaniem. Mam przycisk radiowy asp w kontrolerze wzmacniaka. Mam atrybut nazwy grupy ustawiony na "Klient". Po załadowaniu strony przyciski radiowe nie są zgrupowane. Zamiast pól identyfikatorów ustawionych na nazwę grupy, ustawia się pola wartości przycisków opcji. Wiem, że próbowałem ustawić przyciski radiowe poza kontrolerem przemiennika i miałem ten sam problem. Co tu się dzieje?grupowanie przycisków 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> 

wyjście 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

Jaka wersja ASP.NET to jest? – CAbbott

+0

Przyciski RadioButtons zostaną zgrupowane, jeśli ich "nazwa", a nie "ID", będą identyczne. –

+0

Pomimo twojej uwagi na temat tego, co dzieje się poza przekaźnikiem, myślę, że ten konkretny problem jest ściśle związany z korzystaniem z przekaźnika, jak zauważył CAbbott. Możesz rozważyć zmianę tytułu pytania, aby to odzwierciedlić, jeśli odkryjesz, że tak właśnie jest. – Beska

Odpowiedz

46

I wreszcie obejść tworząc zwykły przełącznik i ustawienie wartości za pomocą eval po stronie serwera.

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

Teraz, gdy aplikacja wykonuje odświeżenie strony, sprawdzić za wartość Request.Form [ „radCustomer”]. Działa to bezbłędnie.

+1

Jeśli potrzebujemy funkcji AutoPostback? – Sam

+0

Nie mogłem tego zrobić, ponieważ potrzebowałem

+0

Niezupełnie bezbłędnie - gdy formularz nie przejdzie jakiejś weryfikacji, to po odświeżeniu wiadomości przez radio przyciski nie są wybierane - innymi słowy: wybór nie jest zapisywany między wiadomościami zwrotnymi. –

0

Chciałbym zacząć od dodanie wartości na moim Radiobutton value = '<% # Eval ("CUSTOMERNUMBER")%>' .

+0

Nie ma atrybutu wartości dla kontrolki przycisku radiowego asp. – fizch

+0

Prawdopodobnie miał na myśli własność "Tekst". ;) –

+0

To nie da. Wiedziałem, że po prostu dodam do tego etykietę, ale pomyślałem, że i tak spróbuję. – fizch

19

Niestety, to jest dobrze known issue with radio buttons within a repeater. Jedną z opcji jest utworzenie niestandardowej kontroli serwera uzyskanej z klasy RadioButton i przesłaniającej sposób renderowania.

EDIT: Oto próbka tego, co klasa pochodna może wyglądać następująco:

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. To całkiem spora luka w funkcjonalności. Bleh. – Beska

+1

Jest to oparte na pomyśle, że możesz mieć grupę radiobuttonów w szablonie elementu wzmacniacza (wiele przycisków radiowych w tym samym rzędzie). W takim przypadku potrzebujesz wyjątkowego grupowania opartego na zniekształconym identyfikatorze, ale w większości przypadków ludzie chcą tego, co próbował OP. – CAbbott

+2

Znacznik '' jest samozamykający i nie powinien zawierać etykiety końcowej i tekstu wewnątrz niej. Tekst z nim powinien znajdować się w tagu '

9

Naprawiłem go w javascript

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

Które to "działa" jest tutaj wiele możliwości zamieszania. Jeśli naprawdę chcesz skorzystać z tej metody, upewnij się, że ZDECYDOWANIE udokumentujesz, co się dzieje. –

3

miałem te same problemy. Używam literału jako symbolu zastępczego, aby renderować zdarzenie 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

Pamiętaj, że musisz określić atrybut name (i nie tylko identyfikator), aby przyciski opcji wyświetlały się w Request.Form przy odświeżeniu strony! –

0

zrobiłem mój radiobutton mają AutoPostBack wartość true, a następnie w obsługi zdarzeń ustawić wszystkie inne przyciski radiowe odznaczone.

Nie idealne, ale potrzebuję dużej kontroli nad widocznością i włączonymi atrybutami radiobuttonu, i wydawało się, że łatwiej jest kontrolować ASP.NET niż odwoływać się do skryptu po stronie klienta.

2

musiałem zmodyfikować nieco odpowiedź zamieszczonych powyżej r3dsky.

Oto co pracował dla mnie:

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

Zrobiłem to:

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

Dlaczego? ponieważ jeśli zastąpisz właściwość name dla dowolnego łańcucha, otrzymasz komunikat "nie znaleziono błędu". Musisz więc uzyskać nazwę pierwszego radiobuttonu i zmienić nazwy wszystkich z nich o tej nazwie. To działa jak Sharm;)

0

moje rozwiązanie, podobne do innych:

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