在可枚举形式中具有单个编辑器字段的最佳方法



我有一个表单,它只运行一个模型并返回所有行,。相当基本的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,以允许对项目进行索引。控制器需要根据占位符中的值来确定占位符是否已填充(已输入项目)。

最新更新