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
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++;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf das generierte HTML-Code für die
Html.EditorFor
! Die Helfer schaffen eine checkbox und eine versteckte Feld für jede checkbox um die Staatliche Verwaltung einfach auf server-Seite! Das ist das problem! MitFormCollection
als parameter müssen Sie die Unterscheidung der versteckt von der realen Kontrollkästchen, um den Wert!Hofft, dass diese Ihnen helfen!