为什么rasor代码中不需要“FirstOrDefault()”?

时间:2013-06-11 02:43:05

标签: asp.net asp.net-mvc asp.net-mvc-4

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

我有以下代码。为什么没有必要在html表的FirstOrDefault()部分添加<th>,而我必须在“添加”html表单中添加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)

更新

我将其更改为{{1}},这不会包含插入输入中第一行的值。这应该是解决方案之一。

2 个答案:

答案 0 :(得分:0)

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

这提出了一个问题,因为如果模型为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>

答案 1 :(得分: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>