Utilisation appropriée of.net MVC Html.CheckBoxFor

Tout ce que je veux savoir est la syntaxe correcte pour l'Assistant Html.CheckBoxFor HTML dans ASP.NET MVC.

Ce que j'essaie d'accomplir est que la case à cocher soit initialement cochée avec une valeur D'ID afin que je puisse la référencer dans le contrôleur pour voir si elle est toujours cochée ou non.

Serait ci-dessous la syntaxe appropriée?

@foreach (var item in Model.Templates) 
{ 
    <td> 
        @Html.CheckBoxFor(model => true, item.TemplateId) 
        @Html.LabelFor(model => item.TemplateName)
    </td> 
}
67
demandé sur SteveC 2012-10-01 17:47:26

7 réponses

Ce n'est pas la bonne syntaxe

Le premier paramètre est pas la valeur de la case à cocher mais plutôt la liaison du modèle de vue pour la case à cocher d'où:

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

Le premier paramètre doit identifier une propriété booléenne dans votre modèle (c'est une Expression Pas une méthode anonyme renvoyant une valeur) et la deuxième propriété définit tous les attributs D'élément HTML supplémentaires. Je ne suis pas sûr à 100% que l'attribut ci-dessus cochera initialement votre case, mais vous pouvez essayer. Mais méfiez-vous. Même si cela peut fonctionner, vous pouvez avoir des problèmes plus tard, lors du chargement d'une donnée de modèle valide et cette propriété particulière est définie sur false.

La bonne façon

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

Types de propriétés

Selon Asp.net MVC HtmlHelper méthodes d'extension et travail interne, les cases à cocher doivent se lier à des valeurs booléennes et non à des entiers ce qui semble tu aimerais le faire. Dans ce cas, un champ caché pourrait stocker le id.

Autres aides

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

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

Note: checked est un élément HTML propriété booléenne, et non une valeur d'attribut qui signifie que vous pouvez assigner n'importe quelle valeur. La syntaxe HTML correcte n'inclut aucune affectation, mais il n'y a aucun moyen de fournir un objet c # anonyme avec une propriété indéfinie qui serait rendu en tant que propriété D'élément HTML.

101
répondu Robert Koritnik 2017-03-09 01:59:43

Par défaut, le code ci-dessousne génère pas une case à cocher car les propriétés du modèle remplacent les attributs html:

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

Au lieu de cela, dans votre méthode GET Action , ce qui suit doit être fait:

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'est-à-dire qu'une erreur se produit lors de la publication du formulaire).

Cependant, le code suivant va certainement générer une case à cocher cochée, mais pas préservez vos réponses décocher , au lieu de cocher la case à chaque fois sur les erreurs dans le formulaire.

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

Mise à jour

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

Le code ci-dessus générerait une case à cocher au démarrage et préserverait également votre sélection même en cas d'erreurs dans le formulaire.

14
répondu T Gupta 2014-07-29 07:17:30

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

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

Pour que cela fonctionne, j'ai dû changer cela en:

@{
    var checkboxAttributes = Model.MyBoolValue ?
        (object) new { @class = "mySpecialClass", @checked = "checked" } :
        (object) new { @class = "mySpecialClass" };
}
@Html.CheckBox("MyBoolValue", checkboxAttributes)
7
répondu Kirk Liemohn 2014-07-01 17:17:48

Placez ceci sur votre modèle:

[DisplayName("Electric Fan")]
public bool ElectricFan { get; set; }

private string electricFanRate;

public string ElectricFanRate
{
    get { return electricFanRate ?? (electricFanRate = "$15/month"); }
    set { electricFanRate = value; }
}

Et ceci dans votre cshtml:

<div class="row">
    @Html.CheckBoxFor(m => m.ElectricFan, new { @class = "" })
    @Html.LabelFor(m => m.ElectricFan, new { @class = "" })
    @Html.DisplayTextFor(m => m.ElectricFanRate)
</div>

Qui affichera ceci:

Sortie MVCSi vous cliquez sur la case à cocher ou l'étiquette en gras, il cochera/décochera la case

6
répondu James Gray 2014-11-09 21:53:05

Aucune des réponses ci-dessus n'a fonctionné pour moi lors de la liaison sur POST, jusqu'à ce que j'Ajoute ce qui suit dans CSHTML

<div class="checkbox c-checkbox">
    <label>
        <input type="checkbox" id="xPrinting" name="xPrinting" value="true"  @Html.Raw( Model.xPrinting ? "checked" : "")>
        <span class=""></span>Printing
    </label>
</div>


// POST: Index

[HttpPost]
public ActionResult Index([Bind(Include = "dateInHands,dateFrom,dateTo,pgStatus,gpStatus,vwStatus,freeSearch,xPrinting,xEmbroidery,xPersonalization,sortOrder,radioOperator")] ProductionDashboardViewModel model)
3
répondu Craig Trombly 2016-04-01 05:26:15

Je cherchais la solution pour afficher l'étiquette dynamiquement à partir de la base de données comme ceci:

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 de la solution ci-dessus n'a fonctionné pour moi donc j'ai utilisé comme ceci:

 @Html.CheckBoxFor(m => m.Option1, new { @class = "options" }) 
 <label for="Option1">@Model.Option1Text</label>

 @Html.CheckBoxFor(m => m.Option2, new { @class = "options" }) 
 <label for="Option2">@Mode2.Option1Text</label>

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

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

1
répondu Ali Adravi 2014-06-14 17:18:32

J'ai eu du mal à faire fonctionner cela et j'ai ajouté une autre solution pour tous ceux qui veulent / ont besoin d'utiliser FromCollection.

Au Lieu de:

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

Format html helper comme ceci:

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

Puis dans le viewmodel/model où que votre logique soit:

public void Save(FormCollection frm)
{   
    // to do instantiate object.

    instantiatedItem.SomeProperty = (frm["SomeProperty"] ?? "").Equals("true", StringComparison.CurrentCultureIgnoreCase);

    // to do and save changes in database.
}
1
répondu Yvette Colomb 2016-07-27 09:38:58