1

我有一个“SomeObject”集合的显示

public List<SomeObject> SomeObjects

@Html.DisplayFor(m => m.SomeObjects)

这一切都很好。然后我有一个要求,这意味着我需要为同一个集合提供第二个不同的显示模板。

@Html.DisplayFor(m => m.SomeObjects, "NameOfTemplate")

执行此操作时收到以下消息。我之前使用过命名显示模板,但它可能仅适用于原始类型 - 字符串等?

'System.Collections.Generic.List1[SomeObject]',但是这个字典需要一个类型的模型项'SomeObject'

作为请求添加代码

“测试”显示模板

@model ViewModels.SomeObject

<p class="Namme">
    <span>@Model.Name</span>
</p>

简单视图模型

 public class SomeObject
    {
        public string Name { get; set; }
    }

ParentViewModel 中的属性

public List<SomeObject> SomeObjects { get; set; }

cshtml文件..

@Html.DisplayFor(m => m.SomeObjects, "Test")

对我来说这是一个简单的问题,命名模板是否可以与集合一起使用?它是 mvc 的另一个限制吗?

干杯,约翰

4

2 回答 2

2

是的,您正在将一个列表传递SomeObject给您的显示模板,当它期望时:

@model ViewModels.SomeObject

您需要将模板更改为类似的内容并接受列表作为视图模型:

@model IList<ViewModels.SomeObject>

@foreach (var item in Model) {
<p class="Namme">
    <span>@item</span>
</p>
}

或者更改您在父 CSHTML 文件中传递给显示模板的内容,并使其成为SomeObject类似这样的单个对象:

public List<SomeObject> SomeObjects

@foreach (var item in Model.SomeObjects) {
    Html.DisplayFor(item, "TemplateName")
}

很难回答,因为我不确定您要达到什么目标,以及是什么SomeObject,但这应该为您指明正确的方向。

于 2013-11-13T15:07:35.860 回答
0

的类型SomObjectsList<SomeObjects>所以视图模板必须有一个匹配的模型:

@model `ICollection<ViewModels.SomeObject>`

我更喜欢不将视图限制为具体List<>类,而是使用接口。

这也意味着您必须调整模板以使用循环来遍历集合中的项目。

于 2013-11-13T15:02:25.193 回答