2013-06-11 9 views
42

Mam mvc aplikacji, w których używam modelu tak:Jak przekazać IEnumerable list do kontrolera w MVC, w tym stanie checkbox?

public class BlockedIPViewModel 
{ 
    public string IP { get; set; } 
    public int ID { get; set; } 
    public bool Checked { get; set; } 
} 

teraz mam w celu związania listę takiego:

@model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel> 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
} 

@foreach (var item in Model) { 
<tr> 
    <td> 

     @Html.HiddenFor(x => item.IP)   
     @Html.CheckBoxFor(x => item.Checked) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.IP) 
    </td> 

</tr> 
} 

<div> 
    <input type="submit" value="Unblock IPs" /> 
</div> 

teraz mam kontroler do odbierania akcja od złożenia przycisku:

public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs) 
{ 

    } 

Ale jestem coraz wartość null do lstBlockedIPs gdy przychodzi do kontrolera action.I trzeba uzyskać stan pola wyboru tutaj. Proszę pomóż.

Odpowiedz

84

Użyj listy zamiast i zastąpić swoją pętlę foreach z for pętli:

@model IList<BlockedIPViewModel> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    @for (var i = 0; i < Model.Count; i++) 
    { 
     <tr> 
      <td> 
       @Html.HiddenFor(x => x[i].IP)   
       @Html.CheckBoxFor(x => x[i].Checked) 
      </td> 
      <td> 
       @Html.DisplayFor(x => x[i].IP) 
      </td> 
     </tr> 
    } 
    <div> 
     <input type="submit" value="Unblock IPs" /> 
    </div> 
} 

Alternatywnie można użyć szablonu edytora:

@model IEnumerable<BlockedIPViewModel> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.EditorForModel() 
    <div> 
     <input type="submit" value="Unblock IPs" /> 
    </div> 
} 

a następnie zdefiniować szablon ~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml który będzie automatycznie renderowane dla każdego elementu kolekcji:

@model BlockedIPViewModel 
<tr> 
    <td> 
     @Html.HiddenFor(x => x.IP) 
     @Html.CheckBoxFor(x => x.Checked) 
    </td> 
    <td> 
     @Html.DisplayFor(x => x.IP) 
    </td> 
</tr> 

Powodem, dla którego uzyskałeś null w kontrolerze, jest to, że nie przestrzegałeś konwencji nazewnictwa dla pól wejściowych, które domyślny segregator oczekuje na pomyślne powiązanie z listą. Zapraszam do lektury following article.

Po przeczytaniu spójrz na wygenerowany kod HTML (a dokładniej nazwy pól wejściowych) z moim przykładem i twoim. Następnie porównaj i zrozumiesz, dlaczego twój nie działa.

+3

Również ukryte pola i pola wyboru w oryginalnym kodzie źródłowym nie znajdują się w bloku 'using'. To może być problem. – Chris

+0

Tak, zgadza się. W mojej odpowiedzi przeniosłem je do formularza, aby było jasne. –

+0

To działa dobrze .. Wiele dzięki. –