【问题标题】:EditorFor for list view errorEditorFor 用于列表视图错误
【发布时间】:2015-07-29 09:04:03
【问题描述】:

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

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]”。

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

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

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

对于下一个项目:

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

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

如果我只在项目模板中显示一个项目,我如何获得相关索引?

【问题讨论】:

  • 我假设您的意思是它的public class TemperatureItem 基于您在视图中显示的模型?您的模板是否命名为 Item.cshtml 并位于 /View/Shared/EditorTemplates 文件夹中?
  • 还要注意,EditorFor() 接受 IEnumerable&lt;T&gt; 所以你的 EditorTemplate 应该是 @model Web.Models.Item (不是 IEnumerable&lt;Web.Models.Item&gt; - 该方法足够聪明,可以为基于集合中的每个项目生成 html在模板中的html上
  • 你传递给你的视图是什么,是MyObject还是Item的列表?
  • 如何将模型从一个视图传递到另一个视图?
  • @Coulton 抱歉,我在问题代码中犯了一个错误,现在已修复 - 我有显示项目列表编辑器的 MyObject 视图,因此调用了项目模板

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


【解决方案1】:

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

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

@model Web.Models.Item

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

【讨论】:

  • 当 OP 没有提供控制器代码向我们准确显示他传递给视图的内容时,你怎么能知道这一点?
  • 因为这是模型未传递到视图时生成的确切消息:)
  • @Coulton 好的,我知道了,它可以工作了,谢谢。我现在唯一的问题是在项目模板中我需要显示项目的索引,所以如果我创建了一个包含 2 个空项目的 List 我想在编辑器中显示一个像项目 1 或项目 2 这样的标题根据列表中的哪个项目,我更新了我的问题以反映它。
  • @user1611620,您不能使用EditorTemplate 执行此操作(该方法不知道该项目是集合中的哪个索引)。要实现这一点,您需要在主视图中使用 for 循环 - 例如for(int i = 0; i &lt; Model.Items.Count; i++) { &lt;h3&gt;Item @(i + 1)&lt;/h3&gt; @Html.TextBoxFor(m =&gt; m.Items[i].ItemSetting) }
  • @Stephen 我最初正是这样做的(而不是使用编辑器模板),但是 Item 模型对其属性进行了自定义验证,并且验证同时验证了 List 的两个项目:( 因为它没有将每个 Item 及其属性识别为不同的对象。我将 Item 类添加到我的问题中
【解决方案2】:

你有这个错误的原因是你的控制器和视图没有传递相同类型的对象。可能您的视图正在传递@model Web.Models.Items,而您需要传递以显示“项目”列表的是 @model Enumerable

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 2011-10-03
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多