无法显示嵌套IEnumerable的编辑器模板

时间:2013-11-26 10:45:23

标签: c# asp.net-mvc asp.net-mvc-5

我想在我的视图中显示包含多个字段的文章,但它不能正常工作:字段不显示(只有标题(字段名称))。

文章类:

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)等代码不起作用。

3 个答案:

答案 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)。