Korrekte Verwendung von .net MVC Html.CheckBoxFor

Alles, was ich wissen will, ist die richtige Syntax für den Html.CheckBoxFor HTML Helfer in ASP.NET MVC.

Was ich versuche zu erreichen ist, dass das Kontrollkästchen zunächst mit einem ID-Wert überprüft wird, damit ich es im Controller referenzieren kann, um zu sehen, ob es noch aktiviert ist oder nicht.

Würde unten die richtige Syntax sein?

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

Das ist nicht die richtige Syntax

Der erste Parameter ist kein Checkbox-Wert, sondern View Model Binding für das Kontrollkästchen daher:

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

Der erste Parameter muss eine boolesche Eigenschaft innerhalb Ihres Modells identifizieren (es ist ein Ausdruck, keine anonyme Methode, die einen Wert zurückgibt) und die zweite Eigenschaft definiert zusätzliche HTML-Elementattribute. Ich bin nicht 100% sicher, dass das obige Attribut zunächst Ihre Checkbox überprüft, aber Sie können es versuchen. Aber Vorsicht. Auch wenn es möglicherweise funktioniert, können später Probleme beim Laden gültiger Modelldaten auftreten, und diese bestimmte Eigenschaft wird auf false .

Der richtige Weg

Obwohl mein geeigneter Vorschlag wäre, initialisiertes Modell für Ihre Sicht bereitzustellen, wobei diese bestimmte boolesche Eigenschaft mit true initialisiert wird.

Eigenschaftstypen

Wie Asp.net MVC HtmlHelper Erweiterungsmethoden und innere arbeiten, müssen Kontrollkästchen an boolesche Werte und nicht ganze Zahlen zu binden, was scheint, dass Sie tun HtmlHelper . In diesem Fall könnte ein verstecktes Feld die id speichern.

Andere Helfer

Es gibt natürlich andere Hilfsmethoden, die Sie verwenden können, um größere Flexibilität bezüglich der Werte und des Verhaltens von Kontrollkästchen zu erhalten:

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

Hinweis : checked ist eine boolesche Eigenschaft eines HTML-Elements und kein Wertattribut, was bedeutet, dass Sie ihm einen beliebigen Wert zuweisen können. Die richtige HTML-Syntax enthält keine Zuweisungen, aber es gibt keine Möglichkeit, ein anonymes C # -Objekt mit einer nicht definierten Eigenschaft bereitzustellen, die als HTML-Elementeigenschaft gerendert würde.

Der folgende Code generiert standardmäßig kein Kontrollkästchen, da die HTML-Attribute durch Modelleigenschaften überschrieben werden:

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

Stattdessen muss in Ihrer GET-Aktionsmethode Folgendes ausgeführt werden:

 model.SomeBooleanProperty = true; 

Obiges behält Ihre Auswahl bei (wenn Sie das Kontrollkästchen deaktivieren), auch wenn das Modell nicht gültig ist (dh beim Buchen des Formulars tritt ein Fehler auf).

Der folgende Code wird jedoch sicherlich ein Kontrollkästchen aktivieren, aber Ihre Antworten nicht deaktivieren , sondern das Kontrollkästchen jedes Mal auf Fehler im Formular überprüfen.

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

AKTUALISIEREN

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

Der obige Code erzeugt beim Start ein Kontrollkästchen und behält Ihre Auswahl auch bei Fehlern im Formular bei.

Ich hatte ein Problem mit ASP.NET MVC 5, wo CheckBoxFor meine Checkboxen auf dem serverseitigen validationserrors nicht überprüfen würde, obwohl mein Modell eindeutig den Wert auf True hatte. Mein Razor-Markup / Code sah folgendermaßen aus:

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

Damit dies funktioniert, musste ich Folgendes ändern:

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

Platziere das auf deinem Modell:

 [DisplayName("Electric Fan")] public bool ElectricFan { get; set; } private string electricFanRate; public string ElectricFanRate { get { return electricFanRate ?? (electricFanRate = "$15/month"); } set { electricFanRate = value; } } 

Und das in deinem cshtml:

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

Welches wird dies ausgeben:

MVC Ausgang Wenn Sie auf das Kontrollkästchen oder die fettgedruckte Beschriftung klicken, wird das Kontrollkästchen aktiviert / deaktiviert

Keine der obigen Antworten funktionierte für mich, wenn ich an POST gebunden bin, bis ich das Folgende in CSHTML hinzugefügt habe

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

Ich suchte nach der Lösung, das Etikett dynamisch aus der database zu zeigen:

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

Also funktionierte nichts von der obigen Lösung für mich, also habe ich folgendes verwendet:

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

Wenn der Benutzer auf das Label klickt, wird das Kontrollkästchen ausgewählt.

Könnte sein, dass es jemandem helfen kann.

Ich hatte Probleme damit, dies zum Laufen zu bringen, und fügte eine weitere Lösung für jeden hinzu, der FromCollection verwenden wollte / brauchte.

Anstatt von:

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

Format HTML-Helfer wie folgt:

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

Dann im Viewmodel / Modell, wo auch immer deine Logik ist:

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