2012-04-02 15 views
5

Estoy desarrollando una aplicación web ASP.Net MVC 3 y tengo algunas dificultades para obtener los valores de una lista de casillas de verificación. Ya he leído la mayoría de las preguntas sobre Stackoverflow en esta área, sin embargo, sigo teniendo algunos problemas.ASP.Net MVC 3 Recuperar valores de la lista de casillas de verificación

que tienen un modelo de vista

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

Otro modelo de vista que utilizan el modelo de vista por encima de

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

Luego, en mi regulador

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

El código en el controlador anterior es conseguir una lista de todos los elementos posibles de la lista de casillas de verificación, y luego obtener una lista de todas las c lista de heckbox elementos para los que establece la opción marcada en verdadero.

Mi vista se ve así, girando sobre SpecialityList y creando una casilla de verificación para cada elemento, y también estableciendo su valor seleccionado en verdadero si es necesario.

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

Mi HttpPost método en mi controlador tendrá el aspecto siguiente

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

Sin embargo, cuando intento para conseguir las casillas de verificación seleccionadas en

model.SpecialityList 

Nos siempre nula . No estoy seguro de por qué no contiene una lista de ViewModelCheckBox.

¿Alguien puede ayudarme con esto?

Gracias.

Respuesta

13

que tienen un Enumerable de estos en mi vista del modelo

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

entonces yo uso un editor de plantillas para mostrarlos en la página.

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

En la vista, uso lo siguiente para mostrarlos en la página.

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

Cuando se devuelve el formulario, el modelo está correctamente encuadernado.

Espero que esto ayude.

+0

+1 para ver modelos y plantillas de editor. –

+0

Gran respuesta. Gracias. – tgriffiths

+0

Interesante, he estado buscando algo como esto por algún tiempo. Gracias. –

0

Es porque le dio a la casilla el nombre @item.Name. El clasificador de modelo verificará si puede asignarlo a una propiedad particular en el modelo, pero no puede encontrarlo porque está buscando el valor de @item.Name y no para la propiedad SpecialtyList.

Phil Haack tiene un buen artículo sobre el modelo de encuadernación a una lista. Sugiero que verifique uno.

Además, no creo que pueda modelar el enlace a un objeto personalizado, porque los valores de las casillas de verificación que entran son solo cadenas.Debería hacer otra propiedad en su modelo que sea de tipo IEnumerable a la cual los valores de las casillas de verificación estén vinculados por modelo. Se vería así:

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

De esta manera usted puede utilizar el SpecialityList para llenar los valores en la vista, y el SpecialityListValues para recuperar los valores. Tenga en cuenta que el nombre de las casillas de verificación debe corresponder con SpecialityListValues.

Cuestiones relacionadas