2012-07-19 43 views
1

的名字,我有以下視圖模型:錯誤的渲染子視圖模型屬性

public class ViewModel 
{ 
    //... 
    [UIHint("Children") 
    public IList<ChildViewModdel> Children {get;set;} 
} 

其中ChildViewModel類有數量屬性(long類型)。

這裏是孩子們編輯模板:

@model IList<ChildViewModel> 
@for (var index = 0; index < Model.Count(); index++) 
{ 
    @Html.EditorFor(x => x[index]) 
} 

現在我通過@Html.EditorForModel()和結果渲染模型第一ChildViewModel的控管數量文本框中的名稱是Children.[0].Quantity。你在[0]之前看到這個額外的點嗎?由於結果模型聯編程序無法識別這些值,並且在用戶發佈表單時沒有正確處理它們。我怎樣才能讓ASP.NET MVC rene Children[0].Quantity名稱?

回答

2

首先讓我說明這是有點正確的行爲(至少「按設計」)。當MVC潛入嵌套屬性時,它會附加「PropertyName」。 (在結尾處提到點)在嵌套模型中的每個字段前面。所以你得到「孩子」。來自ViewModel,「[0]」。來自IList<ChildViewModel>和來自ChildViewModel的「數量」。

這裏的主要問題是爲什麼你需要一個特殊的模板IList<ChildViewModel>? MVC有它自己的特殊情況來處理IEnumerables,所以通常你不應該干涉。

如果你真的需要一些特殊的處理,你可以將IList<ChildViewModel>換成另一個類,並在EditorTemplate中爲你的類引入你的特殊邏輯。它會像:

public class ViewModel 
{ 
    public ChildViewModdels Children {get;set;} 
} 
public class ChildViewModdels 
{ 
    public IList<ChildViewModdel> Children {get;set;} 
} 

在這裏,它將出現在ChildViewModdels EditorTemplate

@model ChildViewModdels 
@for (var index = 0; index < Model.Children.Count(); index++) 
{ 
    @Html.EditorFor(x => x.Children[index]) 
} 

同樣的特殊的邏輯,這是對的情況下,如果你真的需要特殊邏輯(這是不確定的問題)