it-swarm.com.de

Checkboxwert in ASP.NET MVC abrufen 4

Ich arbeite an einer ASP.NET MVC 4-App. Diese App hat eine Grundform. Das Modell für mein Formular sieht folgendermaßen aus:

public class MyModel
{
    public string Name { get; set; }
    public bool Remember { get; set; }
}

In meinem Formular habe ich folgendes HTML.

<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember">&nbsp;Remember Me?</label>

Wenn ich das Formular poste, ist der Remember-Wert im Modell immer false Die Name-Eigenschaft im Modell hat jedoch einen Wert. Ich habe dies getestet, indem Sie einen Haltepunkt im Folgenden festlegen:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
  Console.WriteLine(model.Remember.ToString());
}

Ich kann es nicht verstehen. Warum wird der Checkbox-Wert nicht gesetzt? 

109
JQuery Mobile
@Html.EditorFor(x => x.Remember)

Wird generieren:

<input id="Remember" type="checkbox" value="true" name="Remember" />
<input type="hidden" value="false" name="Remember" />

Wie funktioniert es:

  • Wenn checkbox nicht markiert ist, übermittelt das Formular nur den hidden-Wert (false).
  • Wenn diese Option aktiviert ist, übermittelt das Formular zwei Felder (false und true) und MVC-Sets true für die bool-Eigenschaft des Modells

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

Wenn diese Option aktiviert ist, wird immer der Standardwert gesendet.

188
webdeveloper

Da Sie Model.Name verwenden, um den Wert festzulegen. Ich gehe davon aus, dass Sie ein leeres Ansichtsmodell an die Ansicht übergeben. 

Der Wert für Remember ist also false und setzt den Wert für das Kontrollkästchenelement auf false. Wenn Sie dann das Ankreuzfeld markieren, buchen Sie den Wert "false" mit dem Formular. Wenn Sie es nicht auswählen, wird es nicht gepostet. Daher ist das Modell standardmäßig auf "false" gesetzt. Deshalb sehen Sie in beiden Fällen einen falschen Wert.

Der Wert wird nur übergeben, wenn Sie das Auswahlfeld markieren. Um ein Kontrollkästchen in Mvc verwenden zu können

@Html.CheckBoxFor(x => x.Remember)

oder wenn Sie das Modell nicht an die Ansicht binden möchten.

@Html.CheckBox("Remember")

Mvc zaubert etwas mit einem versteckten Feld, um Werte beizubehalten, wenn sie nicht ausgewählt sind.

Bearbeiten, wenn Sie wirklich eine Abneigung dagegen haben und das Element selbst generieren möchten, können Sie dies tun.

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") />
64
Dan Saltmer

Verwenden Sie nur dieses

$("input[type=checkbox]").change(function () {
    if ($(this).prop("checked")) {
        $(this).val(true);
    } else {
        $(this).val(false);
    }
});
9
Bekir Topuz

Okay, das Kontrollkästchen ist etwas komisch ... Wenn Sie den HTML-Helfer verwenden, werden zwei Markierungsfelderingaben für das Markup generiert, und beide werden als Name-Wert-Paar von IEnumerable übergeben, wenn sie markiert sind.

Wenn es im Markup nicht markiert ist, wird es nur in der verborgenen Eingabe mit dem Wert false übergeben.

So zum Beispiel auf dem Markup haben Sie:

      @Html.CheckBox("Chbxs") 

Und in der Controller-Aktion (stellen Sie sicher, dass der Name mit dem Kontrollkästchen param name auf dem Controller übereinstimmt):

      public ActionResult Index(string param1, string param2,
      string param3, IEnumerable<bool> Chbxs)

Dann können Sie im Controller einige Dinge tun:

      if (Chbxs != null && Chbxs.Count() == 2)
        {
            checkBoxOnMarkup = true;
        }
        else
        {
            checkBoxOnMarkup = false;
        }

Ich weiß, dass dies keine elegante Lösung ist. Hoffe, dass hier jemand Hinweise geben kann.

4
Yini

Um einen von einem Kontrollkästchen in einem Formular zurückgegebenen Wert in eine boolesche Eigenschaft zu konvertieren, habe ich den Build-Konverter von ValueProviderResult in einem benutzerdefinierten ModelBinder verwendet. 

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName");
bool value = (bool)cbValue.ConvertTo(typeof(bool));
3
Chris

Anstatt 

 <input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

benutzen:

 @Html.EditorFor(x => x.Remember)

Dadurch erhalten Sie eine Checkbox speziell für Remember

3
Robert

Ich stieß auf ein ähnliches Problem und konnte den Checkbox-Wert zurückholen, indem er ein Checkbox, hiddenfor und wenig JQuery wie folgt verwendete:

@Html.CheckBox("isPreferred", Model.IsPreferred)
@Html.HiddenFor(m => m.IsPreferred)

<script>

    $("#isPreferred").change(function () {

        $("#IsPreferred").val($("#isPreferred").val());

    })

</script>
2
John Meyer

Dies war ein großer Schmerz und das Gefühl, dass es einfacher sein sollte. Hier ist mein Setup und meine Lösung.

Ich benutze den folgenden HTML-Helfer:

@Html.CheckBoxFor(model => model.ActiveFlag)

Dann überprüfe ich im Controller die Formularerfassung und -verarbeitung entsprechend:

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true;
[modelObject].ActiveFlag = activeFlag;
2
fujiiface
@Html.EditorFor(x => x.ShowComment)


$(function () {
        // set default value to control on document ready instead of 'on'/'off' 
        $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower());
    });

    $("#ShowComment").change(function() {
        // this block sets value to checkbox control for "true" / "false"

        var chkVal = $("input[type='checkbox'][name='ShowComment']").val();
        if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true);
        else $("input[type='checkbox'][name='ShowComment']").val(false);

    });
1
Surendran

Für die MVC mit Model . Model:

public class UserInfo
{
    public string UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
}

HTML:

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/>
<label for="checkbox1"></label>

In der Funktion [HttpPost] können wir ihre Eigenschaften abrufen.

[HttpPost]
public ActionResult Login(UserInfo user)
{
   //...
   return View(user);
}
1
Lulala
public ActionResult Index(string username, string password, string rememberMe)
{
   if (!string.IsNullOrEmpty(username))
   {
      bool remember = bool.Parse(rememberMe);
      //...
   }
   return View();
}
0
user586399

Für mehrere Kontrollkästchen mit demselben Namen ... Code zum Entfernen von unnötigem false:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1"));
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1);

Funktion 

public class form_checkbox
{

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val)
    {
        List<string> d_taxe1_list = new List<string>(val);

        int y = 0;

        foreach (string cbox in val)
        {

            if (val[y] == "false")
            {
                if (y > 0)
                {
                    if (val[y - 1] == "true")
                    {
                        d_taxe1_list[y] = "remove";
                    }
                }

            }

            y++;
        }

        val = new List<string>(d_taxe1_list);

        foreach (var del in d_taxe1_list)
            if (del == "remove") val.Remove(del);

        return val;

    }      



}

Benutze es : 

int x = 0;
foreach (var detail in d_prix){
factured.taxe1 = (d_taxe1[x] == "true") ? true : false;
x++;
}
0
Pascal Carmoni

Wenn Sie wirklich HTML (aus welchem ​​Grund auch immer) und nicht die eingebauten HtmlHelper-Erweiterungen verwenden möchten, können Sie dies auf diese Weise tun. 

Anstatt

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

versuchen Sie es mit

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") />

Checkbox-Eingaben in HTML funktionieren, sodass sie bei Aktivierung den Wert senden, und wenn sie nicht aktiviert sind, senden sie überhaupt nichts (was dazu führt, dass ASP.NET MVC auf den Standardwert von Feld, false). Der Wert des Kontrollkästchens in HTML kann alles andere als nur wahr/falsch sein. Wenn Sie also wirklich wollen, können Sie sogar ein Kontrollkästchen für ein String-Feld in Ihrem Modell verwenden.

Wenn Sie den integrierten Html.RenderCheckbox verwenden, werden tatsächlich zwei Eingaben ausgegeben: Kontrollkästchen und ein ausgeblendetes Feld, sodass ein falscher Wert gesendet wird, wenn das Kontrollkästchen deaktiviert ist (nicht nur nichts). Das kann zu unerwarteten Situationen führen, wie zum Beispiel:

0
Tom Pažourek

Ändern Erinnern Sie sich so

public class MyModel
{
    public string Name { get; set; }
    public bool? Remember { get; set; }
}

Verwenden Sie einen nullwertfähigen Bool im Controller und einen Fallback-Wert für den Nullwert

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    model.Remember = model.Remember ?? false;
    Console.WriteLine(model.Remember.ToString());
}
0
irfandar

In meinem Fall habe ich die Modelleigenschaft "Remember" in der get-Methode nicht festgelegt. Überprüfen Sie Ihre Logik in der Steuerung. Möglicherweise machen Sie dasselbe. Ich hoffe diese Hilfe!

0
Nour Lababidi

Ich habe die anderen Antworten durchgelesen und habe es nicht so ganz zum Laufen gebracht.

Mein Formular verwendet Html.EditorFor(e => e.Property), um das Kontrollkästchen zu generieren. Wenn FormCollection im Controller verwendet wird, wird ein Stringwert 'true,false' im Controller übergeben. 

Wenn ich mit den Ergebnissen umgehe, verwende ich eine Schleife, um sie durchzugehen - ich verwende auch eine InfoProperty-Instanz, um den aktuellen Modellwert darzustellen, der aus dem Formular bewertet wird.

Stattdessen überprüfe ich einfach, ob der zurückgegebene String mit dem Word 'true' beginnt, und setze dann eine boolesche Variable auf true und lasse diese in das Rückgabemodell übergeben.

if (KeyName.EndsWith("OnOff"))
{
    // set on/off flags value to the model instance
    bool keyTrueFalse = false;
    if(values[KeyName].StartsWith("true"))
    {
        keyTrueFalse = true;
    }
    infoProperty.SetValue(processedInfo, keyTrueFalse);
}
0
C Gil

Ich bin gerade auf dieses Thema gestoßen (ich kann nicht glauben, dass es nicht ein/aus bindet!)

Sowieso!

<input type="checkbox" name="checked" />

Schreibe einen Wert von "Ein" oder "Aus".

DiesesWIRD NICHTbindet an einen Boolean, aber Sie können diese dumme Workaround machen!

 public class MyViewModel
 {
     /// <summary>
     /// This is a really dumb hack, because the form post sends "on" / "off"
     /// </summary>                    
     public enum Checkbox
     {
        on = 1,
        off = 0
     }
     public string Name { get; set; }
     public Checkbox Checked { get; set; }
}
0
Yablargo

Wenn Sie mit FormCollection anstatt mit Modell arbeiten, kann die Zuweisung so einfach sein wie folgt:

MyModel.Remember = fields["Remember"] != "false";
0
Aaron Carter