我正在尝试构建一个局部视图,可以在顶部添加记录并显示已添加项目的列表。
我有以下代码。为什么没有必要在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}},这不会包含插入输入中第一行的值。这应该是解决方案之一。
答案 0 :(得分:0)
您必须添加FirstOrDefault
,因为model
为IEnumerable
。
因此,为了获得实例,您必须从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>