在可枚举形式中具有单个编辑器字段的最佳方法
本文关键字:编辑器 单个 字段 方法 最佳 枚举 | 更新日期: 2023-09-27 18:19:31
我有一个表单,它只运行一个模型并返回所有行,。相当基本的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>
我遇到的问题是表单是可枚举的,所以当我尝试加载一行时,我得到的消息IEnumerable不包含"字段名"的定义,也没有扩展方法等
我知道我可以使用@Html.Editor而不是的编辑器,但我对我想要使用的模型有很多验证。我可以把这些行放在@foreach部分,加载顶部的行,并使用jquery来清除值,但这似乎是一种糟糕的方式。
这样做的目的是输入新行,而不是编辑现有行。
实现这一目标的最有效方法是什么?
一种方法是将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
,以允许对项目进行索引。控制器需要根据占位符中的值来确定占位符是否已填充(已输入项目)。