12
votes

Groupe de case à cocher ASP.NET MVC

J'essaie de formuler une œuvre pour le manque de «groupe de cocher» dans ASP.NET MVC. Le moyen typique de mettre en œuvre ceci est d'avoir des cases à cocher du même nom, chacune avec la valeur qu'il représente.

int i = 0;
foreach (var cb in Model.Checkboxes)
{ %>
    <input type="checkbox" name="Checkboxes[<%=i%>].IsChecked" <%=cb.IsChecked ? "checked=\"checked\"" : String.Empty %> value="true" />
    <input type="hidden"   name="Checkboxes[<%=i%>].IsChecked" value="false" />
    <input type="hidden" name="Checkboxes[<%=i%>].Value" value="<%= cb.Value %>" />
    <input type="hidden" name="Checkboxes[<%=i%>].Text" value="<%= cb.Text %>" />
    <%= Html.Encode(cb.Text)%><br />
<%      i++;
} %></p>
<p><input type="submit" value="submit" /></p>


5 commentaires

Postez le code de votre contrôleur.


Comme on dit dans la matrice; Il n'y a pas d'état;) Stackoverflow.com/questions/1473483 / ASP-NET-MVC-and-VIEWSTAT E


@Magnus: C'est beaucoup à faire face à ce qui est probablement un problème simple dans le contrôleur.


Oh, mais il y a modélisme ... juste un peu différent.


@Robert Eh bien, ce n'était pas censé être une réponse, juste quelques informations sur MVC, ModelState, etc.


5 Réponses :


6
votes

Je ne sais pas comment résoudre votre problème, mais vous pouvez définir vos cases à cocher avec ce code:

[HttpPost]
public ActionResult Test(CheckedValue[] n)
{
    return View();
}

public class CheckedValue
{
     public bool Checked { get; set; }
     public bool Value { get; set; }
}


2 commentaires

Je pourrais faire quelque chose à cet effet, même si je devrais avoir à lier cela à la liste de valeurs. Comme dans les exemples de la question, j'ai besoin de savoir que [0] est 1 ou dans le cas réel, 79 ou autre. Je suppose que je pourrais gérer cela avec stocker la liste de valeurs est la session.


Bingo! bien pensé. J'avais oublié quelques choses ... 1. Pour faire référence à .value et 2. Que lorsque vous avez une partie d'un tableau avec une valeur postée, le classeur créera l'objet au poste. Si vous ignorez un index, cela ne créera aucun passé.



1
votes

Eh bien ... Les cases à cocher ne vont pas connaître leur état eux-mêmes, surtout si vous n'utilisez pas l'assistant HTML.CheckBox (si vous êtes, voir la réponse de Lukled). Vous allez devoir mettre l'état vérifié de chaque case dans votre visionnage (ou votre modèle), puis effectuez une recherche à votre vue d'une manière ou d'une autre.

AVERTISSEMENT: Vraiment laidée de -concept code:

contrôleur: xxx

vue: xxx tout Je fais ici, c'est en train de passer le tableau N Retour à la vue et s'il contient une valeur pour la case à cocher respective, ajoutez coché = "coché" à l'élément.

Vous voudrez probablement refroidir cela dans un HTMLhelper de votre propre ou, sinon, rendriez cela moins laid, bien sûr.


0 commentaires

6
votes

Voici la solution finale: xxx

et à votre vue: xxx


1 commentaires

Je sais que c'est super vieux mais au lieu de retourner une chaîne, vous devez rendre la valeur de retour MVCHTMLString comme les autres aides @HTML en MVC. Remplacer retour Builder.tostring (tagendermode.normal); avec Retour Nouveau MVCHTMLString (Builder.tostring (TagrenderMode.elfclage))); Cela émettra des balises HTML et donnez des étiquettes de fermeture automatique Étant donné que les entrées sont généralement une fermeture automatique. Grande solution cependant!



1
votes

Cette solution peut intéresser ceux qui souhaitent une approche propre / simple: Maintenir l'état d'une liste dynamique de cases à cocher dans ASP.NET MVC

Je ne recommanderais pas vraiment l'utilisation de HTML.Checkbox, à moins que vous n'ayez une seule case simple, unique à une seule case à un seul bool (ou un couple de statique au maximum). Lorsque vous commencez à avoir des listes de cases à cocher dans une seule case ou des cases à cocher dynamiques, il est difficile de travailler avec et vous finissez par programmer le monde entier dans Bloat Server Side Bloat Juste pour gérer les déficits et obtenir tout ce qui fonctionne. Oubliez-le et utilisez simplement la solution Clean HTML ciblée ci-dessus et vous êtes opérationnel rapidement avec moins de mess à maintenir à l'avenir.


0 commentaires

0
votes

Je sais que cela doit être incroyablement tard, mais simplement en cas d'une autre chose se trouve ici ..

MVC a un moyen de gérer les groupes de case à cocher.

dans votre modèle de vue: < p> [Affichage (Nom = "Quelles cartes de crédit sont acceptées:")]]

chaîne publique [] Employeurs {Obtenir; ensemble; }

sur votre page: xxx

J'ai essayé très fort de créer ces commandes avec un rasoir mais pas de dés. Il conserve Créer ce champ caché que vous avez tous mentionné. Pour votre case à cocher Case Vous n'avez pas besoin de ce champ caché, juste le code que j'ai ajouté ci-dessus. Vous pouvez créer une aide HTML pour créer ce code pour vous. xxx

sur votre page l'utiliser comme: @ Html.CheckboxGroup (m => m.employoles, typeof (Enum.employoles))

J'utilise un énumé mais vous pouvez utiliser n'importe quel type de collection


0 commentaires