2013-10-29 76 views
1

我是MVC的新手,我遇到了一些問題:將模型數據從視圖發佈到控制器

我有一個視圖有2個顯示數據的foreach循環。喜歡的東西:

foreach(var item in Model.items){ 
using (Html.BeginForm("ActionName","ControllerName")){ 
<div> 
@item.Info @Html.EditorFor(i => i.Id) 
    foreach(var parameter in item.parameters){ 
    @parameter.Info @EditorFor(param => parameter.Value) 
} 
<input type="submit" value="Update" /> 
</div> 
} 
} 

到目前爲止好...... 我想允許用戶在項目中的一個編輯參數值,按提交(可在每個單品申報單的提交) 。我嘗試了很多不同的方法來做到這一點,但當controlleraction接收到除item.Id以外的項目時,一切都爲空。

這是做錯了還是錯過了什麼?

+0

你能發表你想要提交的表格的代碼嗎 – Andrew

+0

我已經用表格 –

回答

0

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) 

你的所有字段將被正確命名,允許模型當您提交表單時,您可以獲取正確的值。

現在,有些發生的事情更多的解釋:模板(無論是DisplayTemplateEditorTemplate,根據您的需要)給出了一個具體的模型,它在所有的意見是可重複使用的表示,而當你使用HtmlHelpers(自動調用它按照慣例工作,模板名稱必須是類型名稱)。 ASP.NET MVC已經有內置模板,適用於類型如stringDateTime等(這就是爲什麼當您使用@Html.Editor@Html.EditorForboolean屬性時,您會收到一個複選框)。

當您使用@Html.EditorForIEnumerable<ItemModel>,它會檢查如果EditorTemplate命名ItemModel.cshtml存在,並用它來顯示您的集合中的每個ItemModel。它正確地生成輸入字段,以便在提交時返回值。在此EditorTemplate中,顯示其屬性,包括Parameters,這也是一個複雜類型的集合。然後再次搜索名爲ParameterModel.cshtmlEditorTemplate(在此示例中),並使用它顯示每個參數。

如果未定義模板,則使用默認模板作爲對象類型,該模板僅顯示簡單屬性(如string,int ...)。

這個強大的功能對於保持代碼清晰度非常有用,同時在構建視圖時允許靈活性。請記住,這些模板具有特定的位置:Views/Shared/EditorTemplates(或Views/Shared/DisplayTemplates)或Views/{MyControllerName}/EditorTemplatesViews/{MyControllerName}/DisplayTemplates)。

+0

更新了我的代碼謝謝你的一篇很好的文章!將嘗試一下。 –

相關問題