我有一个cshtml页面,它会将项目列表发送到我的控制器。但是当我点击提交按钮时,没有任何内容被传递给我的控制器。
以下代码是我的cshtml代码,它会将模型传递给我的控制器。
div.style.display = 'inline'
正在进行此操作的控制器如下所示。
@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 });
}
我的问题与此链接Jquery tool DataTable unable to post/submit in an MVC3 Html.BeginForm非常相似 但是我不确定他是如何解决它的,因为对他答案的解释非常简短。
有人可以帮忙吗?
答案 0 :(得分:1)
这里有很多内容,但我会根据模型绑定中常见的陷阱来拍摄它...你应该将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或其他)中观看您的请求,您可以看到此效果发生。
答案 1 :(得分:0)
看看这个答案。当使用foreach而不是for时,他们遇到了类似的问题。模型绑定在前一种情况下不起作用。