我正在关注Steven Sanderson的博客文章here,以创建一个可编辑且可变长度的项目列表。在他的帖子中,他使用div来显示列表中的新项目,但我正在使用表格。因此,我对每个项目的部分视图是渲染带有要编辑的各个字段的tr标记。现在我的部分视图看起来像这样:
<tr>
@using (Html.BeginCollectionItem("LineItems"))
{
<td>
@Html.TextBoxFor(m => m.Description)
@Html.ValidationMessageFor(m => m.Description)
</td>
<td>
@Html.TextBoxFor(m => m.Quantity)
@Html.ValidationMessageFor(m => m.Quantity)
</td>
<td>
@Html.TextBoxFor(m => m.Amount)
@Html.ValidationMessageFor(m => m.Amount)
</td>
}
</tr>
这实际上在我测试过的所有浏览器上都能正确呈现,但问题是这确实会生成无效的HTML,因为它会在开始的tr标记之后放置一个隐藏的输入标记。
<tr>
<input type="hidden" name="LineItems.index" .... />
<td>
...
</td>
...
</tr>
另一位用户在链接帖子上发表了评论,说明你可以将using语句移动到第一个标签中并且它可以正常工作但是我无法使用ASP.NET MVC 3和Razor来实现这一点查看引擎。
有没有人知道如何使用Steven Sanderson提供的逻辑但是在第一个td中获取隐藏的索引输入字段以便不生成无效的HTML?
由于
答案 0 :(得分:4)
经过一些实验,我想出了:
<tr>
<td>
@using (Html.BeginCollectionItem("LineItems"))
{
@Html.TextBoxFor(m => m.Description)
@Html.ValidationMessageFor(m => m.Description)
@:</td>
@:<td>
@Html.TextBoxFor(m => m.Quantity)
@Html.ValidationMessageFor(m => m.Quantity)
@:</td>
@:<td>
@Html.TextBoxFor(m => m.Amount)
@Html.ValidationMessageFor(m => m.Amount)
}
</td>
</tr>
这对我有用。