2012-04-02 21 views
5

Zajmuję się tworzeniem aplikacji sieci Web ASP.Net MVC 3 i mam pewne trudności z uzyskaniem wartości z listy wyboru. Przeczytałem już większość pytań na temat Stackoverflow w tym obszarze, jednak nadal mam pewne problemy.ASP.Net MVC 3 Odzyskaj wartości listy checkbox

mam ViewModel

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

Innym ViewModel które wykorzystują ViewModel powyżej

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

potem w moim kontroler

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); 
    } 

kod w sterowniku powyżej jest coraz listę wszystkich możliwych pozycji na liście wyboru, a następnie uzyskanie listy wszystkich wcześniej wybranych c heckbox elementy listy, dla których ustawia sprawdzoną opcję na true.

Mój widok wygląda następująco: zapętla się w SpecialityList i tworzy pole wyboru dla każdego elementu, a także ustawia jego wybraną wartość na true, jeśli zajdzie taka potrzeba.

<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 metoda w moim kontroler wtedy wygląda to

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 }); 
    } 

jednak, gdy próbuję dostać wybranych pól wyboru w

model.SpecialityList 

Jest nam zawsze zerowej . Nie jestem pewien, dlaczego nie zawiera listę ViewModelCheckBox.

Czy ktoś może mi w tym pomóc?

Dziękuję.

Odpowiedz

13

Mam Enumerable z nich w moim modelu widoku

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

I wtedy użyć edytora szablonów, aby wyświetlić je na stronie.

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

W widoku używam następujących poleceń, aby wyświetlić je na stronie.

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

Po odesłaniu formularza model jest prawidłowo związany.

Mam nadzieję, że to pomoże.

+0

+1 dla modeli widoków i szablonów edytora. –

+0

Świetna odpowiedź. Dziękuję Ci. – tgriffiths

+0

Ciekawe, od jakiegoś czasu szukałem czegoś takiego. Dzięki. –

0

To dlatego, że dałeś pole wyboru o nazwie @item.Name. Segregator modelu sprawdzi, czy może go zmapować do określonej właściwości w modelu, ale nie może go znaleźć, ponieważ szuka wartości o wartości @item.Name, a nie dla właściwości SpecialtyList.

Phil Haack ma ładny artykuł o powiązaniu modelu z listą. Sugeruję, żebyś to sprawdził.

Ponadto, nie sądzę, że można modelować powiązanie z niestandardowym obiektem, ponieważ wartości pól wyboru, które nadchodzą, są po prostu ciągami.Powinieneś utworzyć inną właściwość modelu, która jest typu IEnumerable, do której są przypisane wartości pól wyboru. to będzie wyglądać następująco:

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

W ten sposób można korzystać z SpecialityList wypełnić wartości w widoku, a SpecialityListValues pobrać wartości. Pamiętaj, że pola wyboru muszą odpowiadać SpecialityListValues.

Powiązane problemy