2010-07-13 28 views
12

Estoy tratando de crear una vista que contenga una lista de casillas de verificación que se crean dinámicamente desde una base de datos, y luego recuperar la lista de las seleccionadas cuando se reenvía el formulario.Lista dinámica de casillas de verificación y vinculación del modelo

Mi modelo EF contiene una clase:

public class ItemIWouldLikeACheckboxFor { 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

Tengo un modelo de vista que contiene una lista de estos:

public class PageViewModel { 
    // various other properties 
    public List<ItemIWouldLikeACheckboxFor> checkboxList { get; set; } 
} 

Mi método controlador get:

public ActionResult Create() { 
    var viewModel = new PageViewModel(); 
    viewModel.checkboxList = db.ItemIWouldLikeACheckboxFors.ToList(); 
    return View(viewModel); 
} 

Mi vista:

<% using (Html.BeginForm()) { %> 
    <%-- other stuff here... %> 

    <% foreach (var item in checkboxList) { %> 
     <%: Html.CheckBox(<!-- what exactly ?????? -->) %> 
    <% } %> 

    <%-- other stuff here...%> 
    <input type="submit" /> 
<% } %> 

Mi método post controlador:

[HttpPost] 
public ActionResult Create(PageViewModel viewModel) { 
    // do stuff with other fields 

    // I would like to do something like: 
    foreach (var item in selectedCheckBoxes) { 
     // do stuff 
    } 
} 

Me parece que no puede conseguir que funcione. Mis preguntas básicas están mezcladas como comentarios en los fragmentos de código, pero para recapitular:

  • ¿Mi modelo de vista está OK? (¿Tengo que agregar algo para capturar los seleccionados en lugar de simplemente la lista para mostrar?)
  • ¿Qué debería poner exactamente en la vista para mostrar cada casilla de verificación?
  • ¿Cómo accedo a las casillas de verificación seleccionadas en el controlador después de la publicación?

Respuesta

14

Has visto http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx?

básicamente Escribimos nuestro propio control para hacer que el HTML como se ve bien

<label for="Products"> Select Products </label> 
<ul class="checkBoxList"> 
<li> 
    <input type="hidden" value="0" name="Products.Index"> 
    <input type="checkbox" value="3424" name="Products[0].Id" id="Products0"> 
    <label for="Products0">iPod touch 3rd Generation</label> 
</li> 
<li> 
    <input type="hidden" value="1" name="Products.Index"> 
    <input type="checkbox" value="3123" name="Products[1].Id" id="Products1"> 
    <label for="Products1">Creative Zen</label> 
</li> 
</ul> 
</div> 

Modelo, escribimos un ayudante de encargo, por lo que nuestros páginas aspx se parecen:

<%= Html.DropDownFor(m=>m.products) %> 

Si sigue Phil haacks post, su modelo debe vincularse automáticamente en su controlador.

+0

Muchas gracias, esa combinación de información me hizo pasar de la raya. El siguiente paso (cuando tengo más tiempo) es vincularlo a un ayudante como lo hizo ... – Jon

+0

¡Hay muchos recursos en ayudantes personalizados para que esté bien! ¡Disfrutar! –

Cuestiones relacionadas