2012-04-02 76 views
5

Tôi đang phát triển một ứng dụng Web ASP.Net MVC 3 và tôi đang gặp một số khó khăn khi nhận các giá trị từ danh sách kiểm tra. Tôi đã đọc hầu hết các câu hỏi trên Stackoverflow xung quanh khu vực này, tuy nhiên, tôi vẫn còn một số vấn đề.ASP.Net MVC 3 Lấy giá trị danh sách hộp kiểm

Tôi có một ViewModel

public class ViewModelCheckBox 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public bool Checked { get; set; } 
} 

Một ViewModel mà sử dụng viewmodel trên

public class ViewModelAssignSubSpeciality 
{ 
    public ListItem Item { get; set; } 
    public IList<ViewModelCheckBox> SpecialityList { get; set; } 
} 

Sau đó, trong điều khiển của tôi

public ActionResult AssignSubSpeciality(int id) 
{ 
     //Get a list of all sub-specialities 
     var SpecialityList = _listService.GetListItemsByID(3).ToList(); 

     //Get a list of sub-specialities for the the passed in id, this is either the id of a speciality or grade 
     IList<RelationshipSpecialitySub> assignedSpecialities = _listService.GetAssignedSubSpecialities(id).ToList(); 

     var checkBoxList = new List<ViewModelCheckBox>(); 

     foreach (ListItem item in SpecialityList) 
     { 
      ViewModelCheckBox chkBox = new ViewModelCheckBox { Id = item.listItemID.ToString(), Name = item.description }; 

      //If sub-speciality exists in assignedSpecialities list, then make checkbox checked 
      foreach (var specilaity in assignedSpecialities) 
      { 
       if (specilaity.subID == item.listItemID) 
       { 
        chkBox.Checked = true; 
       } 
       else 
       { 
        chkBox.Checked = false; 
       } 
      } 

      checkBoxList.Add(chkBox); 
     } 

     ViewModelAssignSubSpeciality viewModel = new ViewModelAssignSubSpeciality(); 
     viewModel.ListItem = _listService.GetListItemByID(id); 
     viewModel.SpecialityList = checkBoxList; 

     return View(viewModel); 
    } 

Các mã trong bộ điều khiển trên là nhận được một danh sách của tất cả các mục danh sách kiểm tra có thể có, sau đó nhận danh sách tất cả các c đã chọn trước đó các mục danh sách heckbox mà nó đặt tùy chọn đã chọn thành true.

Chế độ xem của tôi sau đó sẽ trông như thế này, lặp qua SpecialityList và tạo hộp kiểm cho từng mục và cũng đặt giá trị được chọn thành true nếu cần.

<fieldset> 
<legend>Specialities</legend> 

@foreach (var item in Model.SpecialityList) 
{ 
<input type="checkbox" id="@item.Id" name="@item.Name" value="@item.Id" @(item.Checked ? "checked" : "") /> 
<label for="@item.Id">@item.Name</label><br /> 
} 

<input type="submit" value="Save Changes" class="sepH_b" />           

My HttpPost phương pháp trong điều khiển của tôi sau đó trông như thế này

public ActionResult AssignSubSpeciality(ViewModelAssignSubSpeciality model) 
    { 
     //delete all sub-specialities in tbl relationshipSpecialitySub for List 
     foreach (ViewModelCheckBox item in model.SpecialityList) 
     { 
       //_listService.DeleteSubSpecialityFromSpeciality(item.Id); 
     } 

     return RedirectToAction("ListItems", new { id = model.ListItem.listID }); 
    } 

Tuy nhiên, khi tôi cố gắng để có được các hộp kiểm được chọn trong

model.SpecialityList 

Nó chúng tôi luôn luôn là null . Tôi không chắc chắn lý do tại sao nó không chứa một danh sách các ViewModelCheckBox.

Có ai có thể giúp tôi với điều này không?

Cảm ơn bạn.

Trả lời

13

Tôi có một Enumerable các mô hình trong quan điểm của tôi

public class CheckBoxItem 
{ 
    public string Code { get; set; } 
    public bool IsChecked { get; set; } 
    public string Label {get;set;} 
} 

sau đó tôi sử dụng một mẫu soạn thảo để hiển thị chúng trên trang.

<p class="checkbox" style="display:inline"> 
<span style="margin-left:5px;"> 
    @Html.HiddenFor(x => x.Code)   
    @Html.CheckBoxFor(x => x.IsChecked) 
</span> 
@Html.LabelFor(x => x.IsChecked, Model.Label) 
</p> 

Trong chế độ xem, tôi sử dụng như sau để hiển thị chúng trên trang.

@Html.EditorFor(m => m.MyEnumerableOfCheckBoxItem) 

Khi biểu mẫu được đăng trở lại, mô hình bị ràng buộc chính xác.

Hy vọng điều này sẽ hữu ích.

+0

+1 cho mô hình xem và mẫu trình chỉnh sửa. –

+0

Câu trả lời hay. Cảm ơn bạn. – tgriffiths

+0

Thú vị, tôi đã tìm kiếm một cái gì đó giống như thế này trong một thời gian. Cảm ơn. –

0

Đó là vì bạn đã đặt tên hộp kiểm là @item.Name. Trình kết nối mô hình sẽ kiểm tra xem nó có thể ánh xạ nó đến một thuộc tính cụ thể trong mô hình, nhưng nó không thể tìm thấy nó bởi vì nó đang tìm kiếm giá trị @item.Name và không cho thuộc tính SpecialtyList.

Phil Haack có một bài viết hay về mô hình ràng buộc với danh sách. Tôi đề nghị bạn kiểm tra xem nó ra.

Ngoài ra, tôi không nghĩ rằng bạn có thể mô hình liên kết với một đối tượng tùy chỉnh, bởi vì các giá trị của hộp kiểm đang đến chỉ là chuỗi.Bạn nên tạo một thuộc tính khác trên mô hình của bạn có kiểu IEnumerable mà các giá trị của các hộp kiểm là mô hình được ràng buộc. Nó sẽ giống như thế này:

public IList<ViewModelCheckBox> SpecialityList { get; set; } 
public IEnumerable<string> SpecialityListValues { get; set; } 

Bằng cách này bạn có thể sử dụng SpecialityList để điền vào các giá trị trong giao diện, và SpecialityListValues để lấy các giá trị. Lưu ý rằng tên của các hộp kiểm phải tương ứng với SpecialityListValues.

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