2015-03-25 40 views
0

我已經看到類似的問題,並遵循例行答案,以確保所有模型數據都在HTML中呈現。回傳時,在視圖中呈現的MVC模型數據爲空

我已經這樣做了,模型在@ Html.HiddenFor()的視圖中呈現,但是當回發給控制器時,列表中沒有項目?

的看法會很樂意呈現在列表中的多個項目,但List<Item> Items在發佈的數據始終是一個空列表(NOT NULL)

型號

public class ItemCollection 
{ 
    public List<string> AvailiableActions { get; set; } 
    public List<Item> Items { get; set; } 
} 

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string SelectedAction { get; set; } 
} 

查看

@model ItemCollection 
@using (Html.BeginForm("myAction", "myController", FormMethod.Post)) 
{ 
    <fieldset> 
     <div> 
      @Html.HiddenFor(m => Model.Items) 
      @Html.DisplayNameFor(x => x.AvailiableActions) 
      <table> 
       @{ 
        foreach (var item in Model.Items) 
        { 
         @Html.HiddenFor(m => item) 
         @Html.HiddenFor(s => item.Id) 
         <tr> 
          <td>@item.Name</td> 
          <td>@Html.DropDownList(item.SelectedAction, new SelectList(Model.AvailiableActions))</td> 
         </tr> 
        } 
       }     
      </table> 
     </div> 
    </fieldset> 
} 

控制器

[HttpPost] 
    private ActionResult myAction(ItemCollection model) 
    { 
     if (model.Items.Count() == 0) 
     { 
      // this is true.. something is wrong...... 
     } 
    } 
+0

我們需要這個@ Html.HiddenFor (m => item)? – malkam 2015-03-25 07:51:05

回答

1

您不能使用foreach循環來呈現控件的集合。它會呈現重複的idname屬性,而不必將索引器綁定到集合。使用for循環

for (int i = 0; i < Model.Items.Count; i++) 
{ 
    <tr> 
    <td> 
     @Html.HiddenFor(m => m.Items[i].Id) 
     @Html.DisplayFor(m => m.Items[i].Name) 
    </td> 
    <td>@Html.DropDownList(m => m.Items[i].SelectedAction, new SelectList(Model.AvailiableActions))</td> 
    </tr> 
} 

注意你的觀點還包括@Html.HiddenFor(m => Model.Items)@Html.HiddenFor(m => item)這也將失敗,因爲item是一個複雜的對象,你只能綁定到值類型。你需要刪除兩者。

+0

非常感謝。工作一種享受。複雜類型的Html.HiddenFor試圖修復它 – SkeetJon 2015-03-25 07:58:25

1

爲了確保將索引添加到生成的輸出中,您可以考慮使用編輯器模板an example on an other site),而不是迭代所有項目。

EditorTemplates允許你指定一個模板單個Item\Views\Shared\EditorTemplates\Item.cshtml

@model Item 
@{ 
    var options= (List<string>)ViewData["Options"]; 
} 
<tr> 
    <td> 
     @Html.HiddenFor(m => m.Id) 
      @Html.DisplayFor(m => m.Name) 
    </td> 
    <td>@Html.DropDownList(m => m.SelectedAction, new SelectList(options))</td> 
</tr> 

那麼你可能你的觀點簡單地更改爲:

@model ItemCollection 
@using (Html.BeginForm("myAction", "myController", FormMethod.Post)) 
{ 
    <fieldset> 
     <div> 
      <table> 
       @Html.EditorFor(m => m.Items, new {Options = Model.AvailiableActions }) 
      </table> 
     </div> 
    </fieldset> 
} 
+0

您將在哪裏設置從編輯器模板中讀取的ViewData? – SkeetJon 2015-03-25 08:42:39

+0

實際上在控制器中實現了它,只要我寫到:) – SkeetJon 2015-03-25 08:43:12

+1

不,它在主視圖中的調用中:'@ Html.EditorFor(m => m.Items,new {Options = Model.AvailiableActions}) ' – marapet 2015-03-25 08:43:53

相關問題