我想在我的视图中显示包含多个字段的文章,但它不能正常工作:字段不显示(只有标题(字段名称))。
文章类:
public class Article : IComparable
{
public IEnumerable<ArticleField> Fields
{
get;
set;
}
[More properties...]
}
ArticleField类:
public class ArticleField
{
// !! I want this display in a table Header !!
[Display(Name = "Name", ResourceType = typeof(Resources.Classes.ArticleField))]
[Required(ErrorMessageResourceName="required", ErrorMessageResourceType=typeof(Resources.Common.Validation))]
public string Name
{
get;
set;
}
[More properties...]
}
Index.cshtml(对渲染的html显得很好)
@model MygLogWeb.Classes.Article.Article
@using (Html.BeginForm("Index", "Article", FormMethod.Post))
{
@Html.AntiForgeryToken()
<table class="table">
<tbody>
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<td>
@if (Model.IsSystem)
{
@Html.HiddenFor(model => model.Name)
@Model.Name
}
else
{
@Html.EditorFor(model => model.Name)
}
</td>
</tr>
<tr>
<th>
@Html.DisplayNameFor(model => model.IsSystem)
</th>
<td>
@Html.HiddenFor(model => model.IsSystem)
@Model.IsSystem
</td>
</tr>
</tbody>
</table>
<br style="margin: 0.5em 0em;"/>
@* POINT OF INTEREST *@
@Html.EditorFor(model => model.Fields, "ArticleFields")
<button type="submit" name="button" value="save">@Resources.Common.Buttons.save</button>
}
EditorTemplates / ArticleFields.cshtml(对于渲染的html显得很好)
@model IEnumerable<MygLogWeb.Classes.Article.ArticleField>
@using MygLogWeb.Classes.Article
@{
var uid = Guid.NewGuid().ToString();
var GlobalViewBag = ViewContext.Controller.ViewBag;
GlobalViewBag.ItemCount = Model.Count();
}
<table class="table none" id="@uid">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.IsSystem)
</th>
<th>
@Html.DisplayNameFor(model => model.IsVirtual)
</th>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Formula)
</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>
@* POINT OF INTEREST *@
@Html.EditorFor(model => model)
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5">
<input type="button" value="@Resources.Common.Buttons.add" data-row-add="ArticleField" data-row-addto="#@uid > TBODY" />
</td>
</tr>
</tfoot>
</table>
<script type="text/javascript">
new TableEdit("@uid");
</script>
EditorTemplates / ArticleFields.cshtml(根本不会呈现给渲染的html )
@model MygLogWeb.Classes.Article.ArticleField
xxx
我虽然可以public IEnumerable<ArticleField> Fields
List<T>
但我会遇到标题问题。 @Html.DisplayNameFor(model => model.Formula)
等代码不起作用。
答案 0 :(得分:1)
而不是
@Html.EditorFor(model => model)
您必须使用集合的元素
@Html.EditorFor(model => model[0])
或用于循环元素
@foreach (var item in Model)
{
@Html.EditorFor(model => item)
}
如果您打算使用相同型号回发,那么您需要使用List
而不是IEnumerable
才能使用默认型号装订器在帖子中创建对象
答案 1 :(得分:0)
将您的模型转换为列表,对其进行迭代并使用Editor
代替EditorFor
。这条线上的东西:
foreach(var entry in Model.ToList())
{
Editor(entry, "ArticleFieldsItem");
}
然后创建另一个模板:
@model MygLogWeb.Classes.Article.ArticleField
<td>@Html.DisplayFor(model => model.IsSystem)</td>
<td>@Html.DisplayFor(model => model.IsVirtual)</td>
<td>@Html.DisplayFor(model => model.Name)</td>
<td>@Html.DisplayFor(model => model.Formula)</td>
答案 2 :(得分:0)
我最终做了我不想做的事情,我完全停止在我的模型中使用IEnumerable属性,而是使用数组或列表。
然后我当然可以使用[index]的for循环(不是foreach)。