EditorFor for list view error

时间:2015-07-29 09:04:04

标签: asp.net-mvc list ienumerable mvc-editor-templates editorfor

我有一个类,其中包含一个属性作为另一个对象的列表

public class MyObject {
    public MyObject()
    {
        this.Items = new List<Item>
                                {
                                    new Item(),
                                    new Item()
                                };
    }

    public List<Item> Items { get; set; }
    }
}

public class Item
{
    public double ItemSetting { get; set; }

    [CompareIf("ItemSetting", Operator.LessThanOrEqual, ErrorMessageResourceType = typeof(UiResources), ErrorMessageResourceName = "ItemMinError")]
    public double ItemMin { get; set; }
}

我正在尝试在模板中显示列表:

@model IEnumerable<Web.Models.Item>
@{
}

通过:

@model Web.Models.MyObject
@{
    @Html.EditorFor(x => x.Items)
}

但是我收到了一个错误:

  

传递到字典中的模型项是类型的   'Web.Models.MyObject',但这个字典需要一个模型项   输入'System.Collections.Generic.IEnumerable`1 [Web.Models.Item]'。

我正在向编辑器模板传递一个属性类型的属性,为什么它将它作为单个Item类型?

在Item模板中,我需要显示一个标题,告诉List中项目的索引。例如:

<h3>Item 1</h3>
@Html.TextBoxFor(x => x.ItemSetting })

以及下一个项目:

<h3>Item 2</h3>
@Html.TextBoxFor(x => x.ItemSetting })

(记得我在MyObject构造函数中创建了2个空项目)

如果我只在Item模板中显示一个项目,那么我是否会获得相关索引?

2 个答案:

答案 0 :(得分:2)

您收到此错误的原因是您的模型的值为null(因此model.Itemsnull)因此默认情况下,它会将主模型传递给模板。您需要确保将模型的实例传递给GET方法中的视图。

但是主视图中的方法应该是

@model Web.Models.Item

不是@model IEnumerable<Web.Models.Item>。该方法接受IEnumerable<T>并且足够聪明,可以根据模板中的html为集合中的每个项生成html

答案 1 :(得分:0)

您遇到此错误的原因是您的控制器和视图未传递相同类型的对象。可能你的观点是传递@model Web.Models.Items 以及你需要传递什么才能显示&#34;项目列表&#34; @model Enumerable