2011-07-22 45 views
2

這裏是一個局部的一部分:.NET MVC3 Html.HiddenFor在foreach循環期望集合?

@model IEnumerable<BLL.DomainModel.Jerk> 

@foreach (var jerk in Model) 
{ 
    using (Html.BeginForm("AddJerk", "Jerk", FormMethod.Post, new { @class = "jerkListForm" })) 
    { 
    @Html.HiddenFor(jerk =>) 
     @jerk.Name 
     ... 
    } 
} 

HiddenFor拉姆達正在尋找的類型是一樣的@model(IEnumerable的),而我正在尋找內IEnumerable的單個對象。

我錯過了什麼?爲什麼它仍然在foreach循環中尋找一個集合?

+0

我只是想知道如果你真的想在foreach中使用而不是其他方式。這將產生很多

標籤,我認爲。 –

回答

5

所有的HTML助手由Asp.Net提供MVC使用頁面定義模型的模型。你可以做的是創建一個EditorTemplate。在您的視圖文件夾中創建一個名爲EditorTemplates的子目錄,如\Home\EditorTemplates\,並添加一個名爲Jerk.cshtml的新視圖,並以此方式分配模型。

然後,您可以對每個屬性使用Html.HiddenFor(f => f.Name)等等。這會給你你所期望的類型訪問。

在你的主視圖,你會做到以下幾點:

@foreach(var jerk in Model) { 
    @Html.EditorFor(m => jerk) 
} 

或者可以稱之爲EditorForModel它會自動遍歷並尋找EditorTemplate。

@Html.EditorForModel() 

EditorFor會找你首先創建那麼它將從那裏走,直到它的EditorTemplate找到一個替代,否則會輸出一個MVC認爲你可能需要。

+2

欲瞭解更詳細的幫助,我寫了一篇博客文章,詳細介紹如何創建它們:http://buildstarted.com/2010/09/10/overriding-displayfor-and-editorfor-to-create-custom-outputs-for- mvc/ – Buildstarted

+0

我會有一個甘德。謝謝。 – Withnail

3

我會使用for循環代替。這樣你的隱藏領域將有正確的名稱。如果你在你的例子中使用助手,所有隱藏的字段將有一個名稱爲混亂,不會正確回發。

@foreach (var i = 0; i < Model.Count; i++) 
{ 
    var jerk = Model[i]; 
    using (Html.BeginForm("AddJerk", "Jerk", FormMethod.Post, new { @class = "jerkListForm" })) 
    { 
    @Html.HiddenFor(model => model[i]) 
     @jerk.Name 
     ... 
    } 
} 

如果結合不要緊,你的回傳,你可以簡單地做

@ Html.HiddenFor(混蛋=>衝擊)

+0

使用for循環我得到 - 我真的沒有理解HiddenFor()的效用。感謝您的建議。 – Withnail

+0

啊,是的,你不能將複雜的物體存儲在隱藏的領域。您必須存儲每個屬性或混蛋對象。 –

8
@model IEnumerable<Type> 

@foreach(var item in Model) 
{ 

    @Html.HiddenFor(model => item) 

} 

不要忘記Type必須是de/serializable爲了這個工作。