2013-06-25 2 views
2

Lorsque vous utilisez la commande RadioButtonList, je peux accéder à la valeur sélectionnée dans mon codebehind ce qui suit:la valeur sélectionnée d'un groupe de contrôle HtmlInputRadioButton

rbMyButtons.SelectedValue 

Cependant, je voudrais utiliser HtmlInputRadioButton contrôles à la place car ils me donnent un meilleur contrôle sur le balisage rendu. Si j'utilise une liste de <input type="radio" runat="server" /> puis, autant que je sache, je dois faire quelque chose comme ceci:

if (rbMyButtonsOption1.Checked) 
{ 
    ... 
} 
else if (rbMyButtonsOption2.Checked) 
{ 
    ... 
} 
else if ... 

Y at-il une manière que je peux imiter le comportement de RadioButtonList.SelectedValuesans en utilisant Request.Form["name"]?

Répondre

2

Voilà comment je le ferais:

D'abord, envelopper le Html contrôles à l'intérieur d'un panneau ou d'un objet de regroupement similaire (le panneau sera rendu sous la forme un div):

<asp:Panel runat="server" ID="ButtonList" ClientIDMode="Static"> 
    <input type="radio" name="seasons" value="Spring" runat="server" />Spring <br/> 
    <input type="radio" name="seasons" value="Summer" runat="server" /> Summer <br/> 
    <input type="radio" name="seasons" value="Fall" runat="server" /> Fall <br/> 
    <input type="radio" name="seasons" value="Winter" runat="server" /> Winter <br/> 
</asp:Panel> 

Ensuite, créez une méthode d'extension pour accéder à la propriété ControlCollection du panneau et itérer la collection:

public static class HelperFunctions 
{ 
    public static string GetRadioButtonValue(this ControlCollection collection) 
    { 
     foreach (var control in collection) 
     { 
      if (control is HtmlInputRadioButton) 
      { 
       var radioControl = ((HtmlInputRadioButton)control); 
       if (radioControl.Checked) 
       { 
        return radioControl.Value; 
       } 
      } 
     } 

     //If no item has been clicked or no Input Radio controls are present we return an empty string 
     return String.Empty; 
    } 
} 

Enfin, vous pouvez obtenir la valeur avec la facilité:

var selectedValue = ButtonList.Controls.GetRadioButtonValue(); 
+0

Ceci est très bien je commençais à penser le long des lignes. Je vais probablement échanger le panneau contre un espace réservé mais, à part ça, merci pour la réponse. –

0

Vous pouvez imiter ce comportement en utilisant LINQ:

var radioButtons = new[] { rbMyButtonsOption1, rbMyButtonsOption2 }; 
var checkedRadioButton = radioButtons.FirstOrDefault(i => i.Checked); 
if (checkedRadioButton != null) 
{ 
    // do something... 
} 
1

je fait quelques recherches pour trouver cela, donc pensé qu'il pourrait être utile même si la question est plus de 1 an ...

Je viens de rencontrer ce problème. J'avais besoin d'utiliser use [input type = "radio" runat = "server" ...] car je devais inclure des attributs HTML "data- *" supplémentaires pour chaque sélection.

J'ai utilisé un composé des deux réponses ici pour venir avec une solution qui m'a aidé.

Mon HTML ressemble à:

<div id="pnlOpts" runat="server"> 
    <input type="radio" name="rblReason" runat="server" value="1" /> <label>Opt 1</label><br /> 
    <input type="radio" name="rblReason" runat="server" value="3" data-att="1" /> <label>Supplied Reason 1 </label><br /> 
    <input type="radio" name="rblReason" runat="server" value="3" data-att="2" /> <label>Supplied Reason 2 </label><br /> 
    <input type="radio" name="rblReason" runat="server" value="3" data-att="3" /> <label>Supplied Reason 3 </label><br /> 
</div> 

Mon code-behind ressemble à:

if(pnlOpts.Controls.OfType<HtmlInputRadioButton>().Any(a=>a.Checked)) 
{ 
    HtmlInputRadioButton selected = pnlOpts.Controls.OfType<HtmlInputRadioButton>().Where(a => a.Checked).FirstOrDefault(); 
    var btnValue = selected.Value; 
    var dataAttVal = selected.Attributes["data-att"]; 
    ... 
} 
Questions connexes