Utilisation correcte de .net MVC Html.CheckBoxFor

Tout ce que je veux savoir, c’est la syntaxe correcte de l’ Html.CheckBoxFor HTML Html.CheckBoxFor dans ASP.NET MVC.

Ce que j’essaie d’accomplir, c’est que la case à cocher soit initialement cochée avec une valeur d’ID afin de pouvoir la référencer dans le contrôleur pour voir si elle est toujours vérifiée ou non.

Est-ce que ce serait la syntaxe appropriée?

 @foreach (var item in Model.Templates) {  @Html.CheckBoxFor(model => true, item.TemplateId) @Html.LabelFor(model => item.TemplateName)  } 

Ce n’est pas la syntaxe correcte

Le premier paramètre n’est pas la valeur de la case à cocher mais affiche la liaison du modèle pour la case à cocher:

 @Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" }); 

Le premier paramètre doit identifier une propriété booléenne dans votre modèle (il s’agit d’une méthode d’ expression et non d’une méthode anonyme renvoyant une valeur) et la deuxième propriété définit tous les atsortingbuts d’élément HTML supplémentaires. Je ne suis pas sûr à 100% que l’atsortingbut ci-dessus cochera d’abord votre case, mais vous pouvez essayer. Mais méfiez-vous. Même si cela peut fonctionner, vous pouvez avoir des problèmes par la suite, lorsque vous chargez un modèle de données valide et que cette propriété particulière est définie sur false .

La manière correcte

Bien que ma propre suggestion serait de fournir un modèle initialisé à votre vue avec cette propriété booléenne particulière initialisée à true .

Types de propriété

Selon les méthodes d’extension et le fonctionnement interne de Asp.net MVC HtmlHelper , les cases à cocher doivent se lier à des valeurs booléennes et non à des entiers. Dans ce cas, un champ caché pourrait stocker l’ id .

Autres aides

Il existe bien sûr d’autres méthodes d’aide que vous pouvez utiliser pour obtenir une plus grande flexibilité concernant les valeurs et le comportement des cases à cocher:

 @Html.CheckBox("templateId", new { value = item.TemplateID, @checked = true }); 

Remarque : checked est une propriété booléenne d’élément HTML et non un atsortingbut de valeur, ce qui signifie que vous pouvez lui affecter n’importe quelle valeur. La syntaxe HTML correcte n’inclut aucune affectation, mais il est impossible de fournir un object C # anonyme avec une propriété non définie qui serait rendu comme une propriété d’élément HTML.

Par défaut, le code ci-dessous ne générera PAS une case à cocher cochée car les propriétés du modèle remplacent les atsortingbuts html:

 @Html.CheckBoxFor(m => m.SomeBooleanProperty, new { @checked = "checked" }); 

Au lieu de cela, dans votre méthode d’ action GET, les actions suivantes doivent être effectuées:

 model.SomeBooleanProperty = true; 

Ce qui précède préservera votre sélection (Si vous décochez la case) même si le modèle n’est pas valide (c.-à-d. Qu’une erreur se produit lors de la publication du formulaire).

Toutefois, le code suivant générera certainement une case à cocher cochée, mais ne conservera pas vos réponses décochées, mais cochez la case à chaque fois pour les erreurs de forme.

  @Html.CheckBox("SomeBooleanProperty", new { @checked = "checked" }); 

METTRE À JOUR

 //Get Method public ActionResult CreateUser(int id) { model.SomeBooleanProperty = true; } 

Le code ci-dessus génère une case à cocher lors du démarrage et préserve également votre sélection, même en cas d’erreur de forme.

J’avais un problème avec ASP.NET MVC 5 où CheckBoxFor ne vérifiait pas mes cases à cocher sur l’échec de la validation côté serveur même si la valeur de mon modèle était clairement définie sur true. Mon balisage / code de razor ressemblait à ceci:

 @Html.CheckBoxFor(model => model.MyBoolValue, new { @class = "mySpecialClass" } ) 

Pour que cela fonctionne, j’ai dû changer ceci pour:

 @{ var checkboxAtsortingbutes = Model.MyBoolValue ? (object) new { @class = "mySpecialClass", @checked = "checked" } : (object) new { @class = "mySpecialClass" }; } @Html.CheckBox("MyBoolValue", checkboxAtsortingbutes) 

Placez-le sur votre modèle:

 [DisplayName("Elecsortingc Fan")] public bool ElecsortingcFan { get; set; } private ssortingng elecsortingcFanRate; public ssortingng ElecsortingcFanRate { get { return elecsortingcFanRate ?? (elecsortingcFanRate = "$15/month"); } set { elecsortingcFanRate = value; } } 

Et ceci dans votre cshtml:

 
@Html.CheckBoxFor(m => m.ElecsortingcFan, new { @class = "" }) @Html.LabelFor(m => m.ElecsortingcFan, new { @class = "" }) @Html.DisplayTextFor(m => m.ElecsortingcFanRate)

Qui va sortir ceci:

Sortie MVC Si vous cliquez sur la case à cocher ou sur l’étiquette en gras, vous cochez / décochez la case

Aucune des réponses ci-dessus n’a fonctionné pour moi lors de la liaison sur POST, jusqu’à ce que j’ajoute les éléments suivants dans CSHTML

 
// POST: Index [HttpPost] public ActionResult Index([Bind(Include = "dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xEmbroidery,xPersonalization,sortOrder,radioOperator")] ProductionDashboardViewModel model)

Je cherchais la solution pour afficher l’étiquette dynamicment à partir d’une firebase database comme celle-ci:

 checkbox1 : Option 1 text from database checkbox2 : Option 2 text from database checkbox3 : Option 3 text from database checkbox4 : Option 4 text from database 

Donc, aucune des solutions ci-dessus n’a fonctionné pour moi alors j’ai utilisé comme ceci:

  @Html.CheckBoxFor(m => m.Option1, new { @class = "options" })  @Html.CheckBoxFor(m => m.Option2, new { @class = "options" })  

De cette façon, lorsque l’utilisateur cliquera sur l’étiquette, la case à cocher sera sélectionnée.

Peut-être que cela peut aider quelqu’un.

J’ai eu du mal à faire en sorte que cela fonctionne et j’ai ajouté une autre solution pour quiconque désirant ou ayant besoin d’utiliser FromCollection.

Au lieu de:

 @Html.CheckBoxFor(model => true, item.TemplateId) 

Format d’assistance HTML comme ça:

 @Html.CheckBoxFor(model => model.SomeProperty, new { @class = "form-control", Name = "SomeProperty"}) 

Ensuite, dans le modèle de vue / modèle, quelle que soit votre logique:

 public void Save(FormCollection frm) { // to do instantiate object. instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", SsortingngComparison.CurrentCultureIgnoreCase); // to do and save changes in database. }