2011-05-24 83 views
0

我有一個顯示搜索結果的搜索頁面。搜索結果是與特定搜索匹配的人員列表。我正在遍歷這個列表,將它們顯示在表格中。作爲這個表格的標題,我需要模型中的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

回答

3

如果你只需要顯示一個人的細節;你應該考慮只發送一個人的視圖,而不是完整的人員名單。在這種情況下,

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

0

如果它與具有相同姓氏的每個條目的集合,然後嘗試model[0].surnamemodel.ToList().First().surname

你不需要ToList()如果它的一個List<T>已經。那麼它將只是model.First()

0

您正在指定頁面模型是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