在“可枚举”表单中使用单个编辑器字段的最佳方法是什么?

时间:2015-10-28 08:38:24

标签: c# jquery asp.net-mvc razor

我有一个表单,只是运行模型并返回所有行。非常基本的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来清除值,但这似乎是一种糟糕的方式。

这样做的目的是输入一个新行,而不是编辑现有行。

实现这一目标的最有效方法是什么?

1 个答案:

答案 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以允许对项目编制索引。 控制器需要根据占位符中的值确定占位符是否已填充(输入了一个项目)。