foreach
不會爲您的輸入生成正確的名稱,因此您在提交時無法識別模型聯編程序。你可以去for
循環(這給正確的索引),但我建議你使用EditorTemplates
:
在你的主要觀點:
@Html.EditorFor(model => model.Items)
假設你Items
屬性的ItemModel
(通過更換一個集合你使用,你創建一個EditorTemplate
(它必須位於Views/Shared/EditorTemplates
文件夾中採取ItemModel
爲模型的類型)):
@model ItemModel
@Model.Info @Html.EditorFor(model => model.Id)
@Html.EditorFor(model => model.Parameters)
和假設Parameters
'類型的ParameterModel
集合(再次,使用自己的真型),創建另一個EditorTemplate
(仍位於Views/Shared/EditorTemplates
文件夾):
@model ParameterModel
@Model.Info @EditorFor(model => model.Value)
你的所有字段將被正確命名,允許模型當您提交表單時,您可以獲取正確的值。
現在,有些發生的事情更多的解釋:模板(無論是DisplayTemplate
或EditorTemplate
,根據您的需要)給出了一個具體的模型,它在所有的意見是可重複使用的表示,而當你使用HtmlHelpers
(自動調用它按照慣例工作,模板名稱必須是類型名稱)。 ASP.NET MVC已經有內置模板,適用於類型如string
,DateTime
等(這就是爲什麼當您使用@Html.Editor
或@Html.EditorFor
與boolean
屬性時,您會收到一個複選框)。
當您使用@Html.EditorFor
與IEnumerable<ItemModel>
,它會檢查如果EditorTemplate
命名ItemModel.cshtml
存在,並用它來顯示您的集合中的每個ItemModel
。它正確地生成輸入字段,以便在提交時返回值。在此EditorTemplate
中,顯示其屬性,包括Parameters
,這也是一個複雜類型的集合。然後再次搜索名爲ParameterModel.cshtml
的EditorTemplate
(在此示例中),並使用它顯示每個參數。
如果未定義模板,則使用默認模板作爲對象類型,該模板僅顯示簡單屬性(如string
,int
...)。
這個強大的功能對於保持代碼清晰度非常有用,同時在構建視圖時允許靈活性。請記住,這些模板具有特定的位置:Views/Shared/EditorTemplates
(或Views/Shared/DisplayTemplates
)或Views/{MyControllerName}/EditorTemplates
(Views/{MyControllerName}/DisplayTemplates
)。
你能發表你想要提交的表格的代碼嗎 – Andrew
我已經用表格 –