ASP.NET MVC Groupe de cases à cocher
Je suis en train de formuler un travail autour de l'absence d'un "groupe de cases à cocher" dans ASP.NET MVC. Typique de la façon de mettre en œuvre c'est d'avoir des cases à cocher du même nom, chacun avec la valeur qu'il représente.
<input type="checkbox" name="n" value=1 />
<input type="checkbox" name="n" value=2 />
<input type="checkbox" name="n" value=3 />
Lors de la soumission, il va séparés par des virgules toutes les valeurs à la demande de l'élément "n".. en font la Demande["n"] == "1,2,3" si tous les trois sont vérifiées lorsqu'il est soumis. Dans ASP.NET MVC, vous pouvez avoir un paramètre de n sous la forme d'un tableau à accepter ce poste.
public ActionResult ActionName( int[] n ) { ... }
Tous les ci-dessus fonctionne très bien. Le problème que j'ai est que lorsque la validation échoue, les cases à cocher ne sont pas restaurés à leur état activé. Toutes les suggestions.
Problème de Code: (j'ai commencé avec la valeur par défaut asp.net projet mvc)
Contrôleur
public class HomeController : Controller
{
public ActionResult Index()
{ var t = getTestModel("First");
return View(t);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(TestModelView t)
{ if(String.IsNullOrEmpty( t.TextBoxValue))
ModelState.AddModelError("TextBoxValue", "TextBoxValue required.");
var newView = getTestModel("Next");
return View(newView);
}
private TestModelView getTestModel(string prefix)
{ var t = new TestModelView();
t.Checkboxes = new List<CheckboxInfo>()
{ new CheckboxInfo(){Text = prefix + "1", Value="1", IsChecked=false},
new CheckboxInfo(){Text = prefix + "2", Value="2", IsChecked=false}
};
return t;
}
}
public class TestModelView
{ public string TextBoxValue { get; set; }
public List<CheckboxInfo> Checkboxes { get; set; }
}
public class CheckboxInfo
{ public string Text { get; set; }
public string Value { get; set; }
public bool IsChecked { get; set; }
}
}
ASPX
<%
using( Html.BeginForm() ){
%> <p><%= Html.ValidationSummary() %></p>
<p><%= Html.TextBox("TextBoxValue")%></p>
<p><%
int i = 0;
foreach (var cb in Model.Checkboxes)
{ %>
<input type="checkbox" name="Checkboxes[<%=i%>]"
value="<%= Html.Encode(cb.Value) %>" <%=cb.IsChecked ? "checked=\"checked\"" : String.Empty %>
/><%= Html.Encode(cb.Text)%><br />
<% i++;
} %></p>
<p><input type="submit" value="submit" /></p>
<%
}
%>
Code De Travail
Contrôleur
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(TestModelView t)
{
if(String.IsNullOrEmpty( t.TextBoxValue))
{ ModelState.AddModelError("TextBoxValue", "TextBoxValue required.");
return View(t);
}
var newView = getTestModel("Next");
return View(newView);
}
ASPX
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>
Bien sûr quelque chose de semblable peut être fait avec Html Helpers, mais cela fonctionne.
Comme ils le disent dans La Matrice; il n'y a pas d'état 😉 stackoverflow.com/questions/1473483/asp-net-mvc-and-viewstate
C'est beaucoup à parcourir pour ce qui est probablement un problème simple dans le contrôleur.
Oh, mais il y a ModelState... juste un peu différent.
Bon, ce n'est pas ment pour être une réponse, juste quelques informations sur mvc, modelstate etc...
OriginalL'auteur Greg Ogle | 2010-01-14
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas comment faire pour résoudre votre problème, mais vous pouvez définir les cases à cocher avec ce code:
Champs cachés sont nécessaires, parce que si la case n'est pas cochée, le formulaire n'envoie pas n'importe quelle valeur. Avec champ caché, il envoie de faux.
Votre méthode post sera:
Il peut ne pas être optimale et je suis ouvert aux commentaires, mais il fonctionne:)
MODIFIER
Version étendue:
Votre méthode post sera:
Je l'ai écrit sans VS, donc il peut avoir besoin un peu de correction.
Bingo! bonne réflexion. J'avais oublié un couple de choses... 1. pour référence .Valeur et 2. que lorsque vous avez une partie d'un tableau avec un posté valeur, le classeur de créer l'objet à la position. Si vous sautez un indice, il ne crée pas toute l'ignorer.
OriginalL'auteur LukLed
Voici la solution finale:
Et de votre point de vue:
return builder.ToString(TagRenderMode.Normal);
avecreturn new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing));
ce sera de sortie le html et donner à fermeture automatique des balises depuis l'entrée sont généralement à fermeture automatique. Excellente solution si!OriginalL'auteur Hans
Bien... les cases à cocher ne sont pas en train de connaître leur état sur leur propre, en particulier si vous n'êtes pas à l'aide de Html.Case helper (si vous êtes, consultez LuKLed de réponse). Vous allez avoir à mettre les bagages de l'état de chaque zone de votre ViewData (ou Modèle), puis effectuer une recherche dans votre point de Vue d'une manière ou d'une autre.
Avertissement: Vraiment moche preuve-de-concept de code:
Contrôleur:
Vue:
Tout ce que je fais ici est le passage du tableau n retour à la vue, et si elle contient une valeur pour chaque case, en ajoutant
checked="checked"
à l'élément.Vous auriez probablement eu envie de revoir ce dans un HtmlHelper de votre propre, ou au contraire de faire ce moins laid, bien sûr.
OriginalL'auteur Kurt Schindler
Cette solution peut être d'intérêt pour ceux qui veulent nettoyer/approche simple:
Maintenir l'état d'une liste dynamique de cases à cocher dans ASP.NET MVC
Je ne serais pas vraiment recommander l'utilisation de Html.Case à cocher que si vous avez un super-simple, simple case lié à un seul bool (ou un couple de statique au plus). Lorsque vous commencez à avoir des listes de cases à cocher dans un tableau unique ou dynamique des cases à cocher, il est difficile de travailler avec et vous vous retrouvez la programmation de l'ensemble du monde à côté serveur ballonnement pour traiter les insuffisances et d'obtenir tout ce travail. L'oublier, et il suffit d'utiliser le HTML propre concentré la solution ci-dessus et vous êtes rapidement opérationnel avec moins de désordre, de maintenir dans l'avenir.
OriginalL'auteur Aaron
Je sais que ce doit être incroyablement en retard, mais juste au cas où quelqu'un d'autre se trouve ici..
MVC n'ont une façon de gérer les groupes de checkbox.
dans votre modèle de vue:
[Display(Name = "Cartes de Crédit sont Acceptées:")]
public string[] EmployeeRoles{ get; set; }
Sur votre Page:
J'ai essayé très dur pour créer ces contrôles avec le rasoir, mais pas de dés. Il garde
de la création de la zone masquée, vous avez tous évoqué. pour votre groupe de cases à cocher
vous n'avez pas besoin de ce champ caché, juste le code que j'ai ajouté ci-dessus. Vous pouvez créer un helper html pour créer ce code pour vous.
sur votre page de l'utiliser comme ceci:
@Html.CheckboxGroup(m => m.EmployeeRoles, typeof(Énumérations.EmployeeRoles))
- Je utiliser un enum, mais vous pouvez utiliser n'importe quel type de collection
OriginalL'auteur Charles McIntosh