我有一个表单,只是运行模型并返回所有行。非常基本的MVC之一:
@model IEnumerable<Something.Else.Model>
<table>
<thead>
<tr>
<th>@Html.DisplayNameFor()</th>
<th>@Html.DisplayNameFor()</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.)</td>
<td>@Html.DisplayFor(modelItem => item.)</td>
</tr>
}
</tbody>
</table>
但是,我想要的是在单击按钮时加载编辑器行,并且由于我在模型上的验证,编辑器字段引用模型。
@model IEnumerable<Something.Else.Model>
<table>
<thead>
<tr>
<th>@Html.DisplayNameFor()</th>
<th>@Html.DisplayNameFor()</th>
</tr>
</thead>
<tbody>
<tr style="display: none"> // editor row
<td>@Html.EditorFor()</td>
<td>@Html.TextBox()</td>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.)</td>
<td>@Html.DisplayFor(modelItem => item.)</td>
</tr>
}
</tbody>
</table>
我遇到的问题是表单是Enumerable,所以当我尝试加载单行时,我得到的消息IEnumerable不包含&#34;字段名称&#34;的定义。没有扩展方法等等
我知道我可以使用@ Html.Editor而不是编辑器,但我对我想要使用的模型进行了大量验证。我可以将这些行放在@foreach部分并加载顶部的一行并使用jquery来清除值,但这似乎是一种糟糕的方式。
这样做的目的是输入一个新行,而不是编辑现有行。
实现这一目标的最有效方法是什么?
答案 0 :(得分:1)
一种方法是用foreach
替换for
项目索引,在集合末尾添加占位符(空)项目,并在按钮点击时显示编辑项目:
@model List<Something.Else.Model>
<table>
<thead>
<tr>
<th>@Html.DisplayNameFor(m => m.First)</th>
<th>@Html.DisplayNameFor(m => m.Second)</th>
</tr>
</thead>
<tbody>
<tr id="edit-item" style='display: none'>
<td>
@Html.EditorFor(m => Model[Model.Count - 1].First)
</td>
<td>
@Html.EditorFor(m => Model[Model.Count - 1].Second)
</td>
</tr>
@for (var i = 0; i < Model.Count - 1; i++) // the last item is the placeholder (editing item)
{
<tr>
<td>
@Html.DisplayFor(m => Mode[i].First)
@Html.HiddenFor(m => Mode[i].First)
</td>
<td>
@Html.DisplayFor(m => Mode[i].Second)
@Html.HiddenFor(m => Mode[i].Second)
</td>
</tr>
}
</tbody>
</table>
模型类型更改为List
以允许对项目编制索引。
控制器需要根据占位符中的值确定占位符是否已填充(输入了一个项目)。