如何从视图访问模型?

如何从视图访问模型?

问题描述:

我有一个显示搜索结果的搜索页面。搜索结果是与特定搜索匹配的人员列表。我正在遍历这个列表,将它们显示在表格中。作为这个表格的标题,我需要模型中的DisplayName。如果我不继承IEnumerable,我将无法遍历列表。我在这个MVC的东西新=)如何从视图访问模型?

我在结果这样的循环:

<% foreach (var item in Person) { %> 
    <%: item.surname %> 
<% } %> 

但是我怎么打印“显示名称”的属性,而不经过整个列表迭代?我只想做:

<%: 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

OK

... 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> 

因此,我们需要更多的信息,所以你只想要显示的第一记录,还是希望在模型中的项目上显示所有姓氏会更容易?我有点困惑...... – 2011-05-24 16:00:41

+0

不,我不想和记录无关。我想要显示已在模型中为属性“姓氏”设置的“DisplayName”。我已经更新了一下我的问题。 – Niklas 2011-05-25 06:57:48

+0

但是您发送的IENumerable 没有“姓氏”,它不是Person对象,它是一个IENumerable 个人。如果你不想要任何与物品有关的事情,你应该重新考虑你的设计。 – bastijn 2011-05-25 07:15:10

如果你只需要显示一个人的细节;你应该考虑只发送一个人的视图,而不是完整的人员名单。在这种情况下,

Model.Surname 

会像那样工作。因此,而不是:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<RegistryTest.Models.Person>>" 

Inherits="System.Web.Mvc.ViewPage<RegistryTest.Models.Person>" 

在这种情况下,一个人被加载到你的模型和Model.Property工作正常。如果你想要一个IENumerable <>,想想这意味着什么。你正在发送一个人名单,所以你的“模型”中唯一的人是一个人数不可少的人。如果您调用Model,视图就无法知道您想要什么。属性,因为在模型中有多个对象,并且视图不知道你想从哪个对象获取属性。底线,如果你想调用Model.Property(Model.surname),但也想发送一个IENumerable,你有一个设计缺陷。如果你发送一个列表,你应该对整个列表进行一些操作(迭代并对内容做些什么)。如果你只想在列表中的某个人做某件事,重新设计你的视图/控制器并发送给那个人;那么你可以使用Model.Property。

//编辑基于评论 在我看来,现在无论你想要做的这两件事一个(我不知道是哪个):

  1. 显示项目的记录在你的在表中列出并将表中显示的当前对象的DisplayName放在标题中。
  2. 显示表格中的所有项目并在标题中放置某种DisplayName。这样做的意义不大,但可能是您的意思是要列出您的名单。

情况1 这是工作作为你的代码的其余部分?以下将工作得很好。

<% foreach (var item in Model) { %> 
    <table> 
     <th>item.DisplayName</th> 
     <tr> 
     <td>item.Property1</td> 
     <td>item.Property2</td> 
     </tr> 
    </table> 
<% } %> 

情况2 如果你想在列表的显示名称(??),你应该创建一个包含人的IEnumerable和一个公共字符串LISTNAME一个视图模型。现在,你可以这样做:

<table> 
    <th>Model.ListName</th> 
    <% foreach (var item in Model) { %>   
     <tr> 
     <td>item.Property1</td> 
     <td>item.Property2</td> 
     </tr> 
    <% } %> 
</table> 

这将创建一个表与表(在视图模型给出)为标题的名称,并在你有你的人表项。

设计问题? 但是,我希望看到你在上面的问题中写入更多信息。给我们更多关于你想要做什么的信息。你想一个接一个地显示每个人的记录吗?在这种情况下,我会建议您创建一个局部视图你放桌子的地方。然后你会得到这样的:

<% foreach (var item in Model) { %>  
    <% Html.RenderPartial("TablePerson",item); %> 
<% } %> 

tableperson.ascx:恐怕:)

+0

我有一个搜索页面显示搜索结果。搜索结果是与特定搜索匹配的人员列表。我正在遍历这个列表,将它们显示在表格中。作为这个表格的标题,我需要模型中的DisplayName。如果我不继承IEnumerable,我将无法遍历列表。我是这个MVC的新东西=) – Niklas 2011-05-25 07:49:21

+0

结论:首先,我想在表格的标题中显示“DisplayName”,然后遍历显示搜索结果的列表。如果有更正确的方法来做到这一点,我想了解它! – Niklas 2011-05-25 07:54:42

+0

什么是displayname?列表的显示名称? IENumerables没有DisplayNames。如果你想看到你的列表作为一个对象,并给它一个名字,你应该创建一个自定义viewmodel并给它一个列表和一个DisplayName。那将是要走的路。 – bastijn 2011-05-25 08:24:51

如果它与具有相同姓氏的每个条目的集合,然后尝试model[0].surnamemodel.ToList().First().surname

你不需要ToList()如果它的一个List<T>已经。那么它将只是model.First()

您正在指定页面模型是IEnumerable,并且您说您想要打印元素的属性。既然你有一个元素列表,你需要指定你想从哪个元素中检索属性。

我想要列表中的特定索引,您将需要将IEnumerable集合转换为IList(ToList()),具体取决于条件,您也可以使用类似LINQ Single ()操作。

否则,您可以使用Model.Select(m => m.PropertyName)从列表中的所有元素中选择属性,该属性将为您提供此属性的列表,然后将此列表连接到单个字符串。

+0

如果我做'Model.First()。surname',我得到实际的姓氏而不是标签。如果我做'Model.Select(m => m.surname)'它打印'System.Linq.Enumerable + WhereSelectListIterator'2 [RegistryTest.Models.Person,System.String]' – Niklas 2011-05-25 07:01:45