2013-08-01 55 views
3

這很莫名其妙。爲簡單起見,想象一個帶有.Employees可枚舉屬性的公司實體。我在其他地方看到的,這樣的伎倆來獲得EditorTemplates理智呈現枚舉接口是使用語法如下:EditorFor not rendering enumerable without @foreach

在Index.cshtml:

@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate") 

EmployeeEditorTemplate.cshtml預計單個員工

@model MyNamespace.Models.Employee 
//... 
@Html.EditorFor(x => x.FullName) 
// ...etc. 

帖子像這樣的:Viewmodels List Is Null in Action ...表明ModelBinder的是足夠聰明,找出結合和在飛行中索引枚舉。我得到不同的結果(我期望到底是什麼,如果ModelBinder的不應該是這樣mageriffic):

The model item passed into the dictionary is of type 
System.Collections.Generic.List`1[MyNamespace.Models.Employee]', 
but this dictionary requires a model item of type 
'MyNamespace.Models.Employee'. 

枚舉它自己呈現收集就好了,但發出相同的ID,每行的控制(這是不是最佳的,當然,但它告訴我EditorTemplate按照功能):

@foreach (var item in Model.Employees) 
{ 
    @Html.EditorFor(x => item, "EmployeeEditorTemplate") 
} 

這種結構也沒有張貼company.Employees收集回我的其他控制器的動作。

關於實現以下要求的任何想法?

  • 渲染子集,每個實例唯一ID列表
  • 後孩子收集回來的模型

我不在乎,如果我必須枚舉它自己,也不管它位於EditorTemplate的內部或外部;我剛剛看到它說這是不必要的,如果你讓它處理事情,MVC的效果會更好。謝謝。

回答

5

每@大衛坦西(從this answer - 看到了更詳細的說明):

(改變,以適應這個問題)

當您使用@Html.EditorFor(c => c.Employees)時,MVC約定選擇IEnumerable的默認模板。該模板是MVC框架的一部分,它爲枚舉中的每個項目生成Html.EditorFor()。然後,該模板將爲列表中的每個項目生成適當的編輯器模板 - 在您的情況下,它們都是Employee的實例,因此,Employee模板用於每個項目。


綜上所述他的解釋上,當您使用命名的模板,你是,實際上,經過整個IEnumerable<Employee>到模板使用@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate")期待一個Employee

note:我真的只是回答這個,因爲它沒有答案,我首先偶然發現了這裏。至少現在有人沒有關閉它,並可能錯過一個答案,而不必經歷重複的問題投票,等等等等。

+0

我有確切的問題,我有一個名爲Children(名錄)的集合,我的編輯器名稱應該是什麼?什麼是對流? –

1

你可以閱讀一下:Hanselman's article

總之,你應該在你的視圖(index.cshtml)寫:

int i=0; 
@foreach (var item in Model.Employees) 
{ 
    @Html.TextBox(string.Format("Model[{0}].FullName", i), item.FullName) 
    i++; 
} 
+0

我考慮過去那個方向,但在接受這個問題的答案的實施例明確地顯示'EditorFor(X => x.enumerable property)'在單實例編輯器之外:http://stackoverflow.com/questions/7135615/editortemplate-for-list-of-complex-type-returns-null-while-editortemplate-for-i –

+0

在http://stackoverflow.com/a/16631512/141508找到答案;命名編輯器模板和可枚舉模型綁定存在問題。用'@ Html.EditorFor(x => x.Employees)'(沒有指定編輯器視圖名稱)替換'@ Html.EditorFor(company => company.Employees,「EmployeeEditorTemplate」)'實際上修復了它,並且集合發佈回來了。我不喜歡回答自己的問題,所以我會把它留給其他人來簡潔地總結David Tansey的答案)。 –

1

foreach可以與@HTML.EditorFor被使用,一個例子見下面的語法:

@foreach(var emp in @Model) 
{ 
    @Html.EditorFor(d => emp.EmployeeName) 
    @Html.EditorFor(d => emp.Designation) 
    <br /> 
}