【问题标题】:Can I have a named display template for a collection我可以有一个集合的命名显示模板吗
【发布时间】:2013-11-13 14:23:15
【问题描述】:

我有一个“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 的另一个限制..

干杯, 约翰

【问题讨论】:

  • 确保 Display 模板中的模型与您通过 DisplayFor razor 扩展传入的模型类型相同。似乎它不是您的显示模板中的通用列表。例如在您的模板中:'@model IList' 与 '@model SomeObject'
  • 我尝试了您的建议,但没有成功。我的理解是 displayTemplates 的模型应该是单个而不是集合。这是我尝试过的,错误 @model IList HttpCompileException 未被用户代码处理。 “外部组件抛出异常。”
  • 你能发布完整的代码,包括模板。基本上,无论您通过 Display For 传递什么,它都应该是 Display Template 的模型类型。尝试放置一个'@Html.DisplayFor(m => m .SomeObjects.First(), "TemplateName")'。好像您只是传入了不正确的模型类型。也包括调用 CSHTML 页面的模型代码。

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


【解决方案1】:

是的,您正在将 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 是什么,但这应该会为您指明正确的方向。

【讨论】:

  • 感谢 gdp.. 它是 mvc 的一个限制,所以.. 作为传递列表(当没有命名显示模板工作正常时,mvc 会为我循环)一旦你使用命名模板,它会传递集合,所以是的,模型需要是集合,因此需要其中的 for 循环。对我来说毫无意义,因为我的调用代码中有一个 for 循环,我想使用显示模板来消除它。正如曾经提到的那样,它不是一个命名的模板,它工作得很好……嗯。生活和学习:)
  • 只是您的自定义显示模板中的模型类型不正确。将其更改为模板中的列表是 MVC 将在后台执行的操作,仅使用以下代码:'@Html.DisplayFor(m => m.MyCollection)'。
  • true,但在我的模板中,如果我尝试访问对象的元素,我需要 for 循环。我想避免的事情。当它不是命名模板时,我不需要循环。这对我来说是主要区别..
  • 是的,不幸的是,你无法避免这种情况,如果你想要更精细的控制,那么你必须循环模型。
【解决方案2】:

SomObjects 的类型是List&lt;SomeObjects&gt;,所以视图模板必须有匹配的模型:

@model `ICollection<ViewModels.SomeObject>`

我不希望将视图限制在具体的 List&lt;&gt; 类,而是使用接口。

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

【讨论】:

  • Anders,如果我这样做,我需要使用 for 循环对其进行迭代。我使用模板的目的是从调用页面中删除 for 循环。通过将单个对象作为模型,我不需要循环,mvc 负责迭代。这一切都很好,直到我尝试命名模板,这是我的问题所在,因为我有很多使用集合的工作..与这篇文章相关..stackoverflow.com/questions/8002059/…
  • 问题在于,你只能告诉 MVC 为 整个集合 使用什么模板,然后它会使用其内部逻辑来查找每个项目的模板。如果这是您想要控制的内容,那么您可能不走运,因为我不知道将显示模板传递给第二个查找步骤的方法。
猜你喜欢
  • 2019-06-28
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2014-02-02
  • 2011-12-21
  • 1970-01-01
相关资源
最近更新 更多