2013-04-28 40 views
2

我有以下看法...DisplayNameFor&EditorFor在同樣的觀點

@model IEnumerable<Contact> 

@{ ViewBag.Title = "Contact Manager"; } 


    <table> 
     <tr> 
      <th> 
       @Html.DisplayNameFor(model => model.FirstName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.MiddleName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.LastName) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.HomePhone) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.WorkPhone) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.MobilePhone) 
      </th> 
      <th> 
       @Html.DisplayNameFor(model => model.EMail) 
      </th> 
      <th></th> 
     </tr> 

    @*This first row is the search form*@ 

     <tr> 
      <th> 
       @Html.EditorFor(model => model.FirstName) 
      </th> 
      <th> 
       @Html.EditorFor(model => model.MiddleName) 
      </th> 
      <th> 
       @Html.EditorFor(model => model.LastName) 
      </th> 
      <th> 
       @Html.EditorFor(model => model.HomePhone) 
      </th> 
      <th> 
       @Html.EditorFor(model => model.WorkPhone) 
      </th> 
      <th> 
       @Html.EditorFor(model => model.MobilePhone) 
      </th> 
      <th> 
       @Html.EditorFor(model => model.EMail) 
      </th> 
      <th></th> 
     </tr> 

    </table> 

的問題是,在謂詞參數傳遞給「EditorFor()」調用「模式」參數,指的是IEnumerable和而不是單個聯繫人項目在「DisplayNameFor()」方法中似乎的方式。因此,我收到編譯錯誤,因爲屬性名稱(例如:「FirstName」)不是IEnumerable的屬性。

Intellisense實際上向函數的謂詞參數中使用的「method」參數返回了各種IEnumerable方法(如「Select()」)。奇怪的是,即使「DisplayNameFor()」方法調用似乎可行,intellisense也不會顯示聯繫人的屬性。

這裏有什麼區別?

說實話,它是有道理的,因爲模型是IEnumerable這個語法不起作用。然而,我很困惑,爲什麼它會爲您在生成強類型視圖作爲列表時由嚮導插入的「DisplayNameFor()」方法起作用。然後在這種情況下,爲什麼它會爲一個(DisplayNameFor())...而不是其他(EditorFor())。

謝謝 摹

+0

我猜這是一個重複的問題 - 查看解答[這裏] [1] [1]:http://stackoverflow.com/questions/4947854/how-to-get-the-column-titles-from-the-displayname-dataannotation-for-a-strong – CodeMonkeyKing 2013-04-28 22:27:11

回答

1

的原因是,DisplayNameFor不依賴於一個實例的顯示名稱正好可以從檢查你的屬性等級,而EditorFor獲得。需要實際的數據,因此需要一個實例

如果你真的只綁定到單個實例,你應該改變你的模型:

@model Contact 

的DisplayNameFor將繼續工作,你的編輯也將啓動工作

如果綁定到一個列表中,你需要在你的編輯器環

+0

感謝方式的差分。如果你不瞭解這一點,並且正在使用示例,那麼它就不那麼清楚了。 – 2013-04-30 01:36:02

3

爲了編輯領域,他們不得不提及的各個屬性(使他們能夠正確地模型約束)。 DisplayNameFor基本上獲得集合中第一個項目的標籤。

你必須做一個循環(循環for如果你是在救它,否則字段將不會被正確索引)。試試這個(您可能需要讓你的模型List<T>雖然:

@for (int i = 0; i < Model.Count(); i++) 
{ 
    <tr> 
     <th> 
      @Html.EditorFor(m => m[i].FirstName) 
     </th> 
     <th> 
      @Html.EditorFor(m => m[i].MiddleName) 
     </th> 
     <th> 
      @Html.EditorFor(m => m[i].LastName) 
     </th> 
     <th> 
      @Html.EditorFor(m => m[i].HomePhone) 
     </th> 
     <th> 
      @Html.EditorFor(m => m[i].WorkPhone) 
     </th> 
     <th> 
      @Html.EditorFor(m => m[i].MobilePhone) 
     </th> 
     <th> 
      @Html.EditorFor(m => m[i].EMail) 
     </th> 
     <th></th> 
    </tr> 
}