2012-04-02 8 views
5

Sto sviluppando un'applicazione Web ASP.Net MVC 3 e sto riscontrando alcune difficoltà nell'ottenere i valori da una checkboxlist. Ho già letto la maggior parte delle domande su Stackoverflow in quest'area, tuttavia ho ancora alcuni problemi.ASP.Net MVC 3 Recupera i valori dell'elenco di caselle di controllo

Ho un ViewModel

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

Un'altra ViewModel che utilizzano il ViewModel sopra

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

Poi, nel mio controller

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

Il codice nel controller sopra è sempre una lista di tutti gli elementi dell'elenco di caselle di controllo possibili, quindi ottenere un elenco di tutti i c selezionati in precedenza heckbox elenca gli elementi per i quali imposta l'opzione selezionata su true.

La vista personale è simile a questa, scorre su SpecialityList e crea una casella di controllo per ciascun elemento e imposta il valore selezionato su true se necessario.

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

mio HttpPost metodo in mio controller appare allora come questo

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

Tuttavia, quando si tenta di ottenere le caselle selezionate in

model.SpecialityList 

Ci sempre null . Non sono sicuro del motivo per cui non contiene un elenco di ViewModelCheckBox.

Qualcuno può aiutarmi per favore con questo?

Grazie.

risposta

13

Ho un Enumerable di questi nel mio punto di vista del modello

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

allora io uso un editor di modelli per visualizzarli sulla pagina.

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

Nella vista io uso quanto segue per visualizzarli sulla pagina.

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

Quando il modulo viene registrato, il modello viene associato correttamente.

Spero che questo aiuti.

+0

+1 per modelli di viste e modelli di editor. –

+0

Ottima risposta. Grazie. – tgriffiths

+0

Interessante, ho cercato qualcosa di simile per un po 'di tempo. Grazie. –

0

E 'perché hai dato la casella di controllo il nome @item.Name. Il raccoglitore modello controllerà se può associarlo a una particolare proprietà nel modello, ma non può trovarlo perché sta cercando il valore di @item.Name e non per la proprietà SpecialtyList.

Phil Haack ha un bell'articolo sul collegamento del modello a un elenco. Ti suggerisco di controllarne uno.

Inoltre, non penso che sia possibile associare il modello a un oggetto personalizzato, poiché i valori delle caselle di controllo che stanno arrivando sono solo stringhe.Dovresti creare un'altra proprietà sul tuo modello che sia di tipo IEnumerable a cui i valori delle caselle di controllo sono associati al modello. Si sarebbe simile a questa:

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

In questo modo è possibile utilizzare la SpecialityList per riempire i valori nella vista, e il SpecialityListValues per recuperare i valori. Si noti che il nome delle caselle di controllo deve corrispondere a SpecialityListValues.