我有一个显示搜索结果的搜索页面。搜索结果是与特定搜索匹配的人员列表。我正在迭代这个列表,在表格中显示它们。作为此表的标题,我想从模型中获取DisplayName。如果我不继承IEnumerable,我将无法遍历列表。我是MVC的新手=)
我遍历结果如下:
<% foreach (var item in Person) { %>
<%: item.surname %>
<% } %>
但是如何在不迭代整个列表的情况下打印属性的“DisplayName”?我只想做:
<%: Html.LabelFor(m => m.surname) %>
如果有任何帮助,我会在页面顶部继承IEnumerable:
<%@ Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<RegistryTest.Models.Person>>" %>
修改
我想显示“你的姓”,但我不知道如何从视图中访问它。
[DisplayName("Your surname")]
public object surname { get; set; }
以下是一个非常类似的问题:Can I use LabelFor() when the page inherits from IEnumerable<T>?
答案 0 :(得分:3)
如果您只需要显示一个人的具体信息;您应该考虑只向观点发送一个人而不是完整的人员列表。在那种情况下
Model.Surname
会像那样工作。所以而不是:
Inherits="System.Web.Mvc.ViewPage<IEnumerable<RegistryTest.Models.Person>>"
DO
Inherits="System.Web.Mvc.ViewPage<RegistryTest.Models.Person>"
在这种情况下,一个人被加载到您的模型和Model.Property工作正常。如果你想要一个IENumerable&lt;&gt;,想一想这意味着什么。您正在发送人员列表,因此“模型”中唯一的内容是IENumerable&lt;&gt;人如果调用Model.Property,则视图无法知道您想要什么,因为在模型中有多个对象,并且视图不知道您要从哪个对象获取属性。
底线,如果你想调用Model.Property(Model.surname)但又想发送一个IENumerable你有一个设计缺陷。如果您发送一个列表,您应该想要对完整列表执行某些操作(迭代并对内容执行某些操作)。如果您只想对该列表中的某个人执行某些操作,请重新设计您的视图/控制器并发送该单个人;然后你可以使用Model.Property。
//基于评论的编辑 正如我现在所看到的那样,你要么想做这两件事之一(我不知道哪一件):
情况1 这是你的其余代码吗?以下工作会很好。
<% foreach (var item in Model) { %>
<table>
<th>item.DisplayName</th>
<tr>
<td>item.Property1</td>
<td>item.Property2</td>
</tr>
</table>
<% } %>
情况2 如果你想要一个列表的DisplayName(??),你应该创建一个包含IENumerable of Persons和一个公共字符串ListName的ViewModel。现在你可以做类似的事情:
<table>
<th>Model.ListName</th>
<% foreach (var item in Model) { %>
<tr>
<td>item.Property1</td>
<td>item.Property2</td>
</tr>
<% } %>
</table>
这将创建一个表格,其中包含您的列表名称(在ViewModel中给出)作为标题,以及表格中的项目。“
设计问题? 但是,我很乐意看到你在上面的问题中写了更多信息。给我们一些关于你想做什么的更多信息。您想逐个显示列表中每个人的记录吗?在这种情况下,我建议您创建一个部分视图放置表格。然后你会得到类似的东西:
<% foreach (var item in Model) { %>
<% Html.RenderPartial("TablePerson",item); %>
<% } %>
tableperson.ascx:
...
Inherits="System.Web.Mvc.ViewPage<IEnumerable<RegistryTest.Models.Person>>"
...
<table>
<th>Model.DisplayName</th>
<tr>
<td>Model.Property1</td>
<td>Model.Property2</td>
</tr>
</table>
所以,我们需要更多信息:)
答案 1 :(得分:0)
如果是每个条目具有相同姓氏的集合,请尝试model[0].surname
或model.ToList().First().surname
如果已经ToList()
,则不需要List<T>
。然后它只是model.First()
答案 2 :(得分:0)
您指定页面模型是IEnumerable,并且您说您要打印元素的属性。由于您有一个元素列表,您需要指定要从中检索属性的元素。
我想要一个特定的索引,你需要将IEnumerable集合转换为IList(ToList()),根据标准,你也可以使用像LINQ Single这样的东西找到所需的元素( )。操作。
否则,您可以使用Model.Select(m =&gt; m.PropertyName)从列表中的所有元素中选择属性,它将为您提供此属性的列表,然后将此列表连接到单个字符串。