ASP.NET MVC4 FormCollection.GetValues没有返回正确的值

时间:2013-07-16 20:42:09

标签: asp.net-mvc asp.net-mvc-4 formcollection

我正在使用ASP.NET MVC4构建移动网站。 我的解决方案中的一个页面包含一个表,其中表中的所有行都可以编辑并保存在一个批处理中。为此,我在Controller中的Action中使用FormCollection。这适用于大多数字段的预期,例如:item.IsPercent。这个字段是一个布尔值,FormCollection.GetValues(“item.IsPercent”)返回表中行数的两倍,无论实际值是多少,列表总是在true和false之间交替。

如何为百分比复选框收集正确的值?

示例

enter image description here

我的观点

@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>
}

我的控制器

[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();
    }

更新了解决方案 考虑到FormCollection for a checkbox下方评论中发布的链接,我的解决方案是循环遍历数组:

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++;
}
}

1 个答案:

答案 0 :(得分:2)

查看为Html.EditorFor生成的HTML!帮助者为每个复选框创建一个复选框和一个隐藏字段,以便在服务器端轻松进行状态管理!那就是问题所在!使用FormCollection作为参数,您需要区分隐藏和真实复选框以获取值!

希望这能帮到你!