无法将列表传递到带有数据表的控制器.ASP.net

本文关键字:数据表 控制器 net ASP 列表 | 更新日期: 2023-09-27 18:34:18

我有一个cshtml页面,它将向我的控制器发送项目列表。但是,当我单击提交按钮时,没有任何内容传递给我的控制器。

下面的代码是我的cshtml代码,它将模型传递给我的控制器。

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <div class="form-group">
        @if (Model.Count() != 0)
        {
        <input type='button' value='Save and Update' class="btn btn-primary" data-toggle="modal" data-target="#myModal" />
        }
    </div>
    <table class="table cell-border" id="TempTable5">
        <tbody>
            @if (Model.Count() != 0)
            {
                int j = 0;
                foreach (var item in Model)
                {
                    @Html.HiddenFor(model => item.ExerciseInstruction.ExerciseInstructionID)
                    <tr>
                        <td align="center">
                            <div class="form-group">
                                @Html.DisplayFor(model => item.ExerciseInstruction.ExerciseInstructionID)
                            </div>
                        </td>
                        <td>
                            <div class="form-group">
                                @Html.DisplayFor(model => item.Exercise.Name)
                            </div>
                        </td>
                        <td>
                            <div class="form-group">
                                <iframe width="300" height="175" src=@item.ExerciseVideo.VideoURL frameborder="0" allowfullscreen></iframe>
                            </div>
                        </td>
                        <td align="center">
                            @Html.DisplayFor(model => item.Therapist.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(model => item.ExerciseInstruction.Prescribed_Date)
                        </td>
                        <td>
                            No. of Reps: @item.ExerciseInstruction.Number_Of_Reps<br />
                            No. of Secs to hold: @item.ExerciseInstruction.Number_Of_Secs_PositionHold<br />
                            No. of Sets: @item.ExerciseInstruction.Number_Of_Sets_Per_Day<br />
                            No. of Times: @item.ExerciseInstruction.Frequency_Per_Week<br />
                            Remarks: @if (item.ExerciseInstruction.Remark == null || item.ExerciseInstruction.Remark.Trim() == "")
                        {
                                @:NIL
                                }
                        else
                        {
                                @item.ExerciseInstruction.Remark
                            }
                        </td>
                        <td align="center">
                            @Html.EditorFor(model => item.ExerciseInstruction.ToPerform, new { htmlAttributes = new { style = "width:23px; height:23px;" } })
                        </td>
                        <td>
                            @Html.ActionLink("View", "Details", new { id = Model[j].ExerciseInstruction.ExerciseInstructionID, pageFrom = "performExercises" }, new { target = "_blank" })
                        </td>
                    </tr>
                    j++;
                }
            }
        </tbody>
    </table>
                @if (Model.Count() != 0)
                {
                    <input type='submit' value='Save and Update' class="btn btn-primary" data-toggle="modal" data-target="#myModal" />
                }
}

正在处理此问题的控制器如下所示。

[HttpPost]
        [ValidateAntiForgeryToken]
        [Authorize(Roles = "Therapist")]
        public ActionResult ToPerformExercises(int? pid, List<AssignmentViewModel> avmLIst)
        {
            if (ModelState.IsValid)
            {
                foreach (var item in avmLIst)
                {
                    ExerciseInstruction eI = db.ExerciseInstructions.SingleOrDefault(a => a.ExerciseInstructionID == item.ExerciseInstruction.ExerciseInstructionID);
                    eI.ToPerform = item.ExerciseInstruction.ToPerform;
                    db.Entry(eI).State = EntityState.Modified;
                    db.SaveChanges();
                }
            }
            return RedirectToAction("ViewToPerform", "AssignExercisesViewModel", new { pid = pid });
        }

这是提交弹出框

<div id="myModal" class="modal fade" role="dialog">
            <div class="modal-dialog">
                <!— Modal content-->
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal">&times;</button>
                        <h4 class="modal-title">Confirmation</h4>
                    </div>
                    <div class="modal-body">
                        <p>Are you sure you want to add/remove the Ongoing Exercise(s) for the patient?</p>
                    </div>
                    <div class="modal-footer">
                        <input type="button" class="btn btn-primary" value="Confirm" onclick="DisableButton(this)" />
                        <button type="button" class="btn btn-default" data-dismiss="modal" id="cancel">Cancel</button>
                    </div>
                </div>
            </div>
        </div>

我的问题与此链接非常相似 Jquery 工具 DataTable 无法在 MVC3 Html.BeginForm 中发布/提交但是,我不确定他实际上如何解决它,因为他的答案的解释非常简短。

谁能帮忙?

无法将列表传递到带有数据表的控制器.ASP.net

这里发生

了很多事情,但我会根据模型绑定中的一个常见陷阱来尝试一下......应将foreach更改为for循环,然后更改HtmlEditorFor调用以使用该索引。

因此,为了大大简化您上面的内容...

for(int i = 0; i < model.Count; i++)
{
    // other things
    @Html.EditorFor(model => model[i]. //rest of stuff
    // more other things

MVC 将名称序列化到元素中,然后在发布表单时尝试重新映射此服务器端。如果以这种方式使用 foreach 循环,它将丢失索引并且无法绑定。

如果您在Fiddler(或Chrome或其他)中观察您的请求,您可以看到这种效果发生。

看看这个答案。他们在使用 foreach 而不是 for 时遇到了类似的问题。模型绑定在前一种情况下不起作用。

Model.List 在使用 Razor 的 POST 上为空