0

我正在尝试构建一个局部视图,它可以在顶部添加一条记录并显示添加项目的列表。

我有以下代码。为什么我必须在“添加”html表单中添加html表格FirstOrDefault()的一部分?<th>它似乎FirstOrDefault()总是需要的,因为模型是IEnurable<>. 但是,检查所有的脚手架Index.cshtml文件,你会发现FirstOrDefault()表头中没有。

为添加和删除操作实现一个编辑页面是否是一种更好的方法?

@model IEnumerable<Models.MyModel>

@using (Html.BeginForm("AddItem", "MyAction", FormMethod.Post))
{
    <div class="editor-label">
        @Html.LabelFor(model => model.FirstOrDefault().Col1)
    </div>
    <div class="editor-field">
        @Html.EditorFor(m => m.FirstOrDefault().Col1)
        @Html.ValidationMessageFor(m => m.FirstOrDefault().Col1)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.FirstOrDefault().Col2)
    </div>
    <div class="editor-field">
        @Html.EditorFor(m => m.FirstOrDefault().Col2)
        @Html.ValidationMessageFor(m => m.FirstOrDefault().Col2)
    </div>
    <input type="submit" name="Submit" id="Submit" value="Add" />
}

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Col1)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Col2)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Col1)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Col2)
        </td>
        <td>
            @Html.ActionLink("Delete", "Delete", new { item.Col1, item.Col2})
        </td>
    </tr>
}
</table>

更新:

我将其更改为@Html.EditorFor(m => (new Model.MyModel()).Col1),这不会在插入输入中携带第一行的值。这应该是解决方案之一。

4

2 回答 2

0

您必须添加FirstOrDefault,因为您的modelis IEnumerable。因此,为了获得一个实例,您必须从中获得一个元素IEnumerableFirstOrDefault

但是这会带来一个问题,因为如果模型为 null,则页面在尝试访问该property Col1.

在 中table,您正在迭代中的项目,model因此您不需要做FirstOrDefault

我建议创建一个模型,该模型的属性是您要绑定的实例。

例子:

public class MyViewModel {

    public MyModel MyModel { get; set; }
    public IEnumerable<MyModel> MyModels { get;set; }
}

然后:

@model MyNameSpace.MyViewModel

 <div class="editor-field">
        @Html.EditorFor(m => m.MyModel.Col1)
        @Html.ValidationMessageFor(m => m.MyModel.Col1)
 </div>
于 2013-06-11T02:48:47.917 回答
0

您可以避免在视图中使用 IEnumerable 模型。

模型如下所示。

public class MyModel
{
    public string Col1 { get; set; }
    public string Col2 { get; set; }
    public string Email { get; set; }
    public bool IsAdministrator { get; set; }


}

public class MyLstModel:MyModel
{
    public IEnumerable<MyModel> lstMyModel { get; set; }
}

看法:

@model Models.MyLstModel

    @using (Html.BeginForm("AddItem", "MyAction", FormMethod.Post))
    {
        <div class="editor-label">
            @Html.LabelFor(model => model.Col1)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.Col1)
            @Html.ValidationMessageFor(m => m.Col1)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Col2)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.Col2)
            @Html.ValidationMessageFor(m => m.Col2)
        </div>
        <input type="submit" name="Submit" id="Submit" value="Add" />
    }

    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Email)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.IsAdministrator)
            </th>
            <th></th>
        </tr>

    @foreach (var item in Model.lstMyModel) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Col1)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Col2)
            </td>
            <td>
                @Html.ActionLink("Delete", "Delete", new { item.Col1, item.Col2})
            </td>
        </tr>
    }
    </table>
于 2013-06-11T03:01:24.350 回答