2013-03-05 69 views
5

我有以下幾點:如何編輯MVC4表單中的子對象?

@foreach (var parent in Model.Parents) 
{  
    @foreach (var child in parent.Children) 
    {  
     @Html.TextAreaFor(c => child.name)  
    }     
} 

我怎樣才能編輯爲子對象的工作嗎?我想這樣的事情還有:

<input type="hidden" name="children.Index" value="@child.Id" /> 
<textarea name="children[@child.Id]" >@child.Name</textarea> 

要傳遞一個IDictionary的控制器,但我得到一個錯誤:

[InvalidCastException: Specified cast is not valid.] 
    System.Web.Mvc.CollectionHelpers.ReplaceDictionaryImpl(IDictionary`2 dictionary, IEnumerable`1 newContents) +131 

這似乎是一個很常見的任務...有一個簡單的解決方案對此?我錯過了什麼?我需要使用編輯器模板嗎?如果是這樣,任何MVC4兼容的例子將是太棒了。

回答

11

is there a simple solution to this?

是的。

What am I missing?

編輯器模板。

Do I need to use an Editor Template?

是的。

If so, any MVC4-compatible examples would be fantastic.

ASP.NET MVC 4?從ASP.NET MVC 2開始,編輯器模板就存在了。你需要做的就是使用它們。

@model MyViewModel 
@Html.EditorFor(x => x.Parents) 

,然後顯然定義將自動爲Parents集合中的每個元素(~/Views/Shared/EditorTemplates/Parent.cshtml)呈現一個編輯器模板:

因此,通過擺脫外foreach循環,並用替換它開始

@model Parent 
@Html.EditorFor(x => x.Children) 

,然後,我們將擺脫內0的Children集合中的每個元素(~/Views/Shared/Editortemplates/Child.cshtml)編輯模板元素:

@model Child 
@Html.TextAreaFor(x => x.name) 

在ASP.NET MVC中,一切都按照慣例工作。所以在這個例子中,我假設ParentsIEnumerable<Parent>ChildrenIEnumerable<Child>。相應地調整模板的名稱。

結論:每次在ASP.NET MVC視圖中使用foreachfor時,您都會犯錯,您應該考慮擺脫它並用編輯器/顯示模板替換它。

+0

謝謝Darin。我現在使用模板,他們搖滾。乾杯! – RobVious 2013-03-06 02:51:31