如何从View访问模型?

时间:2011-05-24 15:45:56

标签: asp.net-mvc

我有一个显示搜索结果的搜索页面。搜索结果是与特定搜索匹配的人员列表。我正在迭代这个列表,在表格中显示它们。作为此表的标题,我想从模型中获取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>?

3 个答案:

答案 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. 在表格中显示列表中项目的记录,并将表格中显示的当前对象的DisplayName放在标题中。
  2. 显示表格中列表的所有项目,并在标题中添加某种DisplayName。这样做的可能性较小,但您可能需要为列表命名。
  3. 情况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].surnamemodel.ToList().First().surname

如果已经ToList(),则不需要List<T>。然后它只是model.First()

答案 2 :(得分:0)

您指定页面模型是IEnumerable,并且您说您要打印元素的属性。由于您有一个元素列表,您需要指定要从中检索属性的元素。

我想要一个特定的索引,你需要将IEnumerable集合转换为IList(ToList()),根据标准,你也可以使用像LINQ Single这样的东西找到所需的元素( )。操作。

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