2013-06-11 27 views
42

Tôi có một ứng dụng MVC trong đó tôi đang sử dụng một mô hình như thế này:Làm thế nào để vượt qua danh sách IEnumerable để điều khiển trong MVC bao gồm nhà nước hộp kiểm?

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

Bây giờ tôi có một Xem để ràng buộc một danh sách như thế này:

@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> 

Bây giờ tôi có một bộ điều khiển để nhận hành động từ nút gửi:

public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs) 
{ 

    } 

Nhưng tôi nhận được giá trị null cho lstBlockedIP khi đến hành động điều khiển.I cần nhận trạng thái hộp kiểm tại đây. Hãy giúp tôi.

Trả lời

84

Sử dụng một danh sách thay vào đó và thay thế foreach vòng lặp của bạn với một vòng lặp for:

@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> 
} 

Hoặc bạn có thể sử dụng một mẫu biên tập:

@model IEnumerable<BlockedIPViewModel> 

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

và sau đó xác định các mẫu ~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml mà sẽ tự động được được hiển thị cho từng phần tử của bộ sưu tập:

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

Lý do bạn nhận được null trong bộ điều khiển của bạn là vì bạn không tôn trọng quy ước đặt tên cho các trường nhập của bạn mà trình kết nối mô hình mặc định mong đợi liên kết thành công với một danh sách. Tôi mời bạn đọc following article.

Khi bạn đã đọc nó, hãy xem HTML được tạo (và cụ thể hơn là tên của các trường nhập) với ví dụ của tôi và của bạn. Sau đó so sánh và bạn sẽ hiểu tại sao máy của bạn không hoạt động.

+3

Ngoài ra, các trường ẩn và hộp kiểm trong mã nguồn ban đầu không nằm trong khối 'using' của biểu mẫu. Điều đó có thể là vấn đề. – Chris

+0

Vâng, đúng vậy. Trong câu trả lời của tôi, tôi di chuyển chúng bên trong biểu mẫu để làm rõ điều này. –

+0

Điều đó hoạt động tốt .. Cảm ơn nhiều. –

Các vấn đề liên quan