ASP.NET MVC4 FormCollection.GetValues nicht wieder korrekte Werte

Baue ich eine mobile Website mit ASP.NET MVC4.
Eine der Seiten in meiner Lösung enthält eine Tabelle, wo alle Zeilen in der Tabelle können bearbeitet und gespeichert werden in einem batch. Dazu bin ich mit FormCollection in die Action im Controller. Dies funktioniert wie erwartet für die meisten der Felder, außer einem: item.IsPercent. Dieses Feld ist ein boolean, und FormCollection.GetValues("Element.IsPercent") gibt die doppelte Anzahl der Zeilen in der Tabelle und die Liste immer wechselt zwischen true und false, egal, was die tatsächlichen Werte sind.

Wie erhalte ich den richtigen Wert für die Prozent Checkboxen?

Ein Beispiel

ASP.NET MVC4 FormCollection.GetValues nicht wieder korrekte Werte

Meiner Sicht

@using (Html.BeginForm()) {
 @Html.AntiForgeryToken()
@Html.ValidationSummary(true)

foreach (var group in Model.GroupBy(i => i.Exercise.Name)) {
<table>
<tr>
        <th colspan="4">@Html.Label(group.Key)</th>
</tr>
    <tr>
        <td>Load</td>
        <td>Percent</td>
        <td> </td>
        <td>Reps</td>
    </tr>
 @foreach (var item in group.OrderBy(i => i.Order))
    {

     @Html.HiddenFor(modelItem => item.Id)
    <tr>

        <td>
            @Html.EditorFor(modelItem => item.Load) 
            @Html.ValidationMessageFor(modelItem => item.Load)
        </td>
        <td>
            @Html.EditorFor(modelItem => item.IsPercent)
        </td>
        <td>
            x
        </td>
        <td>
            @Html.EditorFor(modelItem => item.Repetitions)
             @Html.ValidationMessageFor(modelItem => item.Repetitions)
        </td>
    </tr>
    }
    </table>
    <br />
}

<p>
    <input type="submit" value="Save" />
</p>
}

Mein Controller

[HttpPost]
    public ActionResult EditProgramTemplateLines(FormCollection c)
    {
        int i = 0;
        int ptId = 0;
        if (ModelState.IsValid)
        {
            var ptIdArray = c.GetValues("item.id"); //[1,2,3,4]
            var ptLoadArray = c.GetValues("item.Load"); //[50, 55, 60, 80]
            var ptPercentArray = c.GetValues("item.IsPercent"); //[true, false, true, false, true, false, true, false]
            var ptRepsArray = c.GetValues("item.Repetitions"); //[13, 10, 5, 2]

            for (i = 0; i < ptIdArray.Count(); i++) {
                var ptLine = factory.GetProgramTemplateLine(Convert.ToInt32(ptIdArray[i]));
                if(ptId == 0)
                    ptId = ptLine.ProgramTemplateId;

                ptLine.Load = ConvertToDouble(ptLoadArray[i]);
                ptLine.IsPercent = Convert.ToBoolean(ptPercentArray[i]);
                ptLine.Repetitions = ConvertToInt(ptRepsArray[i]);
                factory.SetEntryAsModified(ptLine);

            }
            factory.SaveChanges();
            return RedirectToAction("Details", new { id = ptId });
        }
        return View();
    }

Aktualisierte Lösung
Angesichts der link gepostet in Kommentar unten FormCollection für eine checkbox meine Lösung besteht darin, eine Schleife durch den array wie dieses:

var percentId = 0;
for(i = 0;i<ptIdArray.Count();i++){
if(ptPercentArray[percentId] == true){
item.IsPercent = true;
percentId = percentId + 2;
}
else{
item.IsPercent = false;
percentId++;
}
}
Schreibe einen Kommentar