2010-03-04 17 views
12

Mi caso es este: tengo dos listbox, uno que contiene todos mis elementos de base de datos, y uno vacío. El usuario agrega los elementos necesarios del cuadro de lista completo al cuadro de lista vacío.formcollection solo contiene los valores de elementos html.listbox seleccionados? MVC

Estoy usando un formulario para enviar todos los elementos que el usuario ha agregado.

El problema es que solo se envían los elementos seleccionados de la lista. Por lo tanto, si el usuario deselecciona algunos de los elementos, no se enviarán en el formulario. Mi vista se ve de esta manera:

<% using (Html.BeginForm("MyAction", "MyController")) 
    { %> 

    <%= Html.ListBox("AddedItems", Model.Items)%> 

    <input type="submit" value="Submit" name="SubmitButton"/> 
<% } %> 

mi controlador se ve así:

public ActionResult MyAction(FormCollection formCollection) 
{ 
    var addedItems = formCollection["AddedItems"].Split(','); 

    //....more code that does stuff with the items 
} 

¿Voy por todo el camino equivocado? ¿Hay una mejor manera de enviar los artículos? ¿Qué harías?

Respuesta

22

Estoy haciendo esto también, creo que la forma en que lo resolví es un poco más elegante. Básicamente, solo tengo una función Jquery que se ejecuta antes de la publicación del formulario que selecciona todas las opciones.

$(function() { 
     $("form").submit(function (e) { 
      $("#box2View option").attr("selected", "selected"); 
     }); 
    }); 
+0

eso es lo que terminé haciendo. – Darcy

+0

gran idea hombre! gracias =) –

1

¿Por qué no tener la lista de elementos en casillas de verificación? Luego, puede repetir las casillas de verificación en su acción y tomar todas las casillas de verificación seleccionadas.

<% foreach(var item in Model.Items) { %> 

    <%= Html.CheckBox(String.Format("ItemID.{0}", item.ID)) %> // each item tagged by the items id 

<% } %> 

public ActionResult MyAction(FormCollection formCollection) 
{ 

      foreach (var key in collection.AllKeys.Where(k => !k.Contains("SubmitButton")).ToArray<string>()) 
      { 
       // iterates thru check boxes we got rid of the button 

      } 
} 
+0

Los elementos de la base de datos podrían literalmente estar en los miles. Los elementos que el usuario necesitará variarán de 1 a 10 en la mayoría de los casos. Quería una manera fácil para que el usuario vea todos los artículos seleccionados. Tenía la esperanza de que pudiera vincular el html.listbox o algo así y obtener todos los elementos de esa manera ... realmente no sé si eso es posible/el enfoque correcto – Darcy

2

Porque es solo selectbox. No puede publicar todos los valores en la casilla de selección. Debe usar javascript para capturar elementos agregados y almacenarlos en entradas ocultas.

Código no probado, pero creo que te puede ayudar.

<script type="text/javascript"> 
    function addItem() { 
     var allItems = document.getElementById("AllItems"); 
     var op = allItems.options[allItems.selectedIndex]; 
     var hdSelectedItems = document.getElementById("hdSelectedItems"); 
     var lbSelectedItems = document.getElementById("lbSelectedItems"); 

     lbSelectedItems.options[lbSelectedItems.options.length] = op; 

     if (hdSelectedItems.value != '') { 
      hdSelectedItems.value += "," 
     } 
     hdSelectedItems.value += op.value; 
    } 
</script> 
<%= Html.Hidden("hdSelectedItems") %> 
<%= Html.ListBox("AllItems", Model.Items)%> 
<%= Html.ListBox("lbSelectedItems") %> 
<a href="#" onclick="addItem(); return false;">Add</a> 
+0

Gracias fui con una solución similar a esta. Acabo de agregar los elementos a un Oculto y lo obtuve de mi FormCollection en el controlador – Darcy

+1

No, en absoluto, otra opción es simple que esto, puede hacerlo seleccionando todos los artículos cuando se envía el formulario, pero creo que no es una buena solución. – cem

Cuestiones relacionadas