2014-02-08 75 views
7

我有一個問題,當從視圖到控制器的對象中傳遞一個列表時,列表始終爲空。我應該怎麼做?如何從視圖傳遞列表到控制器

我的模型:

public class ImageModel 
{ 
    public int id { get; set; } 
    public string url { get; set; } 
    public bool delete { get; set; } 
} 

public class SchoolImages 
{ 
    public Nullable<int> schoolid { get; set; } 
    public IList<ImageModel> images; 
} 

的觀點:

@model SchoolAppManager.Models.SchoolImages 

@using (Html.BeginForm("DeleteImages", "Images")) 
{ 

    @Html.HiddenFor(x => x.schoolid) 
    <table> 
    @for (int i = 0; i < Model.images.Count(); i += 4) { 

     <tr> 
      <td> 
       <img src="@Url.Content(Model.images[i].url)" width="50%" /> 
       <br /> 
       @Html.CheckBoxFor(x => x.images[i].delete) 
       @Html.HiddenFor(x => x.images[i].id) 
      </td> 
      <td> 
       @if (i + 1 < Model.images.Count()) 
       { 
        <img src="@Url.Content(Model.images[i + 1].url)" width="50%" /> 
        <br /> 
        @Html.CheckBoxFor(x => x.images[i + 1].delete) 
        @Html.HiddenFor(x => x.images[i + 1].id) 
       } 
      </td> 
      <td> 
       @if (i + 2 < Model.images.Count()) 
       { 
        <img src="@Url.Content(Model.images[i + 2].url)" width="50%" /> 
        <br /> 
        @Html.CheckBoxFor(x => x.images[i + 2].delete) 
        @Html.HiddenFor(x => x.images[i + 2].id) 
       } 
      </td> 
      <td> 
       @if (i + 3 < Model.images.Count()) 
       { 
        <img src="@Url.Content(Model.images[i + 3].url)" width="50%" /> 
        <br /> 
        @Html.CheckBoxFor(x => x.images[i + 3].delete) 
        @Html.HiddenFor(x => x.images[i + 3].id) 
       } 
      </td> 
     </tr> 
    } 
    </table> 

    <input type="submit" value="delete" /> 
} 

當我點擊刪除,SchoolImages傳遞給控制器​​,SchoolImages.schoolId在控制器值,然而,SchoolImages.images爲空。我怎麼能通過SchoolImages.images控制器?

+0

我知道將一個列表傳遞給控制器​​的唯一方法是使用jquery構建它並通過ajax調用傳遞它。如果可能的話,傳遞一個id並重新創建控制器列表 –

回答

6

默認的模型粘合劑不會下地幹活,所以要images屬性:

public IList<ImageModel> images { get; set; } 
+0

會是一個多麼愚蠢的錯誤,謝謝@Zabavsky,你爲我節省了很多時間! – Fuli

1

我想你將有問題的複雜類型綁定到你的模型。如果你沒有得到那個工作。這是另一種方式。

你有一堆複選框,可能具有相同的名稱和不同的值。您可以將它們發佈到採用FormCollection的方法,即。

public ActionResult Test(FormCollection collection) 
{ 
    string results = collection["Blanks"]; 
} 

這會給你一個逗號分隔的值列表(或null,其中沒有勾選複選框)。

@using (Html.BeginForm("Test","Home")) 
{ 
    @Html.CheckBox("Blanks[0]", false); 
    @Html.CheckBox("Blanks[1]", false); 
    @Html.CheckBox("Blanks[2]", false); 

    <input type="submit" value="Submit" /> 
} 

給你:

另外,如果有可能的值作爲服務器上的一組,那麼你可以根據自己的數組的值,這意味着你可以做這樣的事情給複選框名布爾值的在測試方法的數組:

公共的ActionResult測試(布爾[]空白) {}

+0

謝謝,你的方法是非常有用的,但是,@ Zabavsky的答案伎倆! – Fuli

0

試着改變你的模型 「SchoolImages」;使用數組而不是IList <>。

0

它是空的,因爲默認的模型聯編程序不知道如何初始化它。 更改場圖像是一個屬性,並添加一個構造是這樣的:

public class SchoolImages 
{ 
    public SchoolImages() 
    { 
     images = new List<ImageModel>(); 
    } 
    public Nullable<int> schoolid { get; set; } 
    public IList<ImageModel> images { get; set; } 
} 

它應該工作。

相關問題