我可以为集合设置命名的显示模板吗?

时间:2013-11-13 14:23:15

标签: c# asp.net-mvc asp.net-mvc-4 razor-2 display-templates

我有一个“SomeObject”

集合的显示
public List<SomeObject> SomeObjects

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

这一切都很好..然后我有一个要求意味着我需要第二个不同的显示模板用于同一个集合..

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

我在执行此操作时收到以下消息。之前我使用过命名的显示模板,但也许它只适用于基本类型 - 字符串等?

  

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

根据请求添加代码

“测试”DisplayTemplate

@model ViewModels.SomeObject

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

SimpleViewModel

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

ParentViewModel中的属性

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

Cshtml文件..

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

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

干杯, 约翰

2 个答案:

答案 0 :(得分: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是什么,但这应该指向正确的方向。

答案 1 :(得分:0)

SomObjects的类型为List<SomeObjects>,因此视图模板必须具有匹配的模型:

@model `ICollection<ViewModels.SomeObject>`

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

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