2012-04-02 19 views
5

Ich entwickle eine ASP.Net MVC 3-Webanwendung, und ich habe einige Schwierigkeiten mit dem Abrufen der Werte aus einer Checkboxliste. Ich habe bereits die meisten Fragen zu Stackoverflow in diesem Bereich gelesen, habe aber immer noch Probleme.ASP.Net MVC 3 Abrufen von Checkbox-Listenwerten

Ich habe ein Viewmodel

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

Ein weiteres Ansichtsmodell, das das Ansichtsmodell verwendet oben

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

Da ist in meinem 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); 
    } 

Der Code in der Steuerung über eine Liste bekommen von allen möglichen Checkbox-Listenelementen, dann Abrufen einer Liste aller zuvor ausgewählten c heckbox listet Elemente auf, für die die Option checked auf true gesetzt ist.

Meine Ansicht sieht dann folgendermaßen aus: Schleife über die SpecialityList und Erstellen eines Kontrollkästchens für jedes Element und Festlegen des ausgewählten Werts auf true, falls erforderlich.

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

Meine Httppost Methode in meinem Controller sieht dann aus wie diese

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

aber wenn ich versuche, in die Kontrollkästchen zu bekommen

model.SpecialityList 

Es uns immer null . Ich bin mir nicht sicher, warum es keine Liste von ViewModelCheckBox enthält.

Kann mir bitte jemand dabei helfen?

Vielen Dank.

Antwort

13

Ich habe eine Enumerable dieser meiner Meinung nach Modell

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

ich dann einen Editor Vorlage verwenden sie auf der Seite angezeigt werden soll.

In der Ansicht verwende ich Folgendes, um sie auf der Seite anzuzeigen.

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

Wenn das Formular zurückgesendet wird, ist das Modell korrekt gebunden.

Hoffe, das hilft.

+0

+1 für Ansicht Modelle und Editor-Vorlagen. –

+0

Große Antwort. Vielen Dank. – tgriffiths

+0

Interessant, ich habe seit einiger Zeit etwas genau so gesucht. Vielen Dank. –

0

Es ist, weil Sie die Checkbox den Namen @item.Name gaben. Das Modellbindermodul prüft, ob es eine bestimmte Eigenschaft im Modell zuordnen kann, aber es kann es nicht finden, da es nach dem Wert @item.Name und nicht nach der SpecialtyList-Eigenschaft sucht.

Phil Haack hat einen schönen Artikel über Modellbindung an eine Liste. Ich schlage vor, dass Sie das überprüfen.

Ich glaube auch nicht, dass Sie eine Bindung an ein benutzerdefiniertes Objekt modellieren können, da die Werte der Checkboxen, die eintreffen, nur Strings sind.Sie sollten in Ihrem Modell eine andere Eigenschaft vom Typ IEnumerable erstellen, für die die Werte der Kontrollkästchen modellgebunden sind. Es würde wie folgt aussehen:

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

Auf diese Weise können die SpecialityList verwenden können, um die Werte in der Ansicht zu füllen, und die SpecialityListValues die Werte abzurufen. Beachten Sie, dass der Name der Kontrollkästchen mit SpecialityListValues übereinstimmen muss.