2009-01-13 34 views
8

Tengo un formulario que permite al usuario crear "filas" adicionales utilizando JQuery (utilizando .clone) para que puedan decidir la cantidad de la misma información que deben enviar. Mi problema es que no puedo encontrar la forma de acceder a estos elementos de formulario dentro de mi controlador.Envío de elementos de formulario con el mismo nombre

la forma que se ha presentado, podría tener este aspecto

<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="text" name="Amount" id="Amount"> 
    <select name="Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 

Básicamente, el bloque entre input y el selectivo podría repetirse un número infinito de veces. Cuando me presento al controlador, estoy usando FormCollection form para acceder a los elementos del formulario. desde allí no estoy seguro de cómo puedo acceder a los artículos que se han enviado. Pensé en usar un bucle for y luego acceder a ellos a través de algo como form ["Amount"] [i] pero obviamente eso no va a funcionar.

¿Estoy haciendo esto de la manera correcta? Si es así, ¿alguien tiene alguna sugerencia sobre cómo podría funcionar?

Gracias de antemano.

+0

Nunca cree elementos con el mismo atributo 'id =" ... "'. El concepto de 'id' es ser único. –

Respuesta

1

que terminó dándose cuenta de que (blush) el mecanismo que JQuery usa para encontrar la cadena dentro del clon d row (para reemplazar) es básicamente regex. Por lo tanto, solo necesitaba escapar de los corchetes y punto. Una vez que hice esto, pude usar JQuery para crear una forma como sugirió el blog de Phil Haack.

¡En mi próximo número ...!

4

Creo que si tiene varios campos llamados Cantidad, los valores estarán delimitados por comas.

para acceder a cada uno sólo tratar:

string[] amounts = Request.Form["Amount"].Split(new char[] { ',' }); 

Tenga en cuenta, sin embargo, las entradas no se limpian a la presentación de modo que si alguien entra en una coma en el cuadro de texto que va a causar problemas.

Por lo tanto, recomiendo numerarlos.

+0

Eso es correcto, es solo el acceso a ellos con el que estoy teniendo dificultades. – dave

+0

Ah sí, puedes usar el método de división. –

+0

Ok, entonces tal vez estoy buscando en el área incorrecta y tengo que averiguar cómo cambiar los atributos de formulario clonados que incluyen caracteres []! – dave

0

Me Importe1 el número de ellos, AMOUNT2, etc. Amount3

+0

El problema es que a JQuery no parece gustarle cambiar el nombre de un atributo de formulario clonado cuando incluye caracteres []. El elemento de formulario existente se clona, ​​pero los atributos id y name no se modifican. De lo contrario, utilizaría esta técnica http://haacked.com/archive/0001/01/01/model-binding-to-a-list.aspx. – dave

0

Se puede cambiar el atributo id y nombre de la entrada a algo como esto "Cantidad [1]", "Cantidad [2]", "Cantidad [3] "(sí, el atributo id y name puede contener los caracteres especiales" ["o"] "). Luego, en el controlador, escriba un analizador sintáctico de parámetros de solicitud http para recuperar las cantidades como colecciones.

+0

Gracias jscoot, igual que el comentario dejado por la respuesta de Adam. – dave

6

Echa un vistazo Model Binding To A List. Su método de acción debe ser:

public ActionResult MyAction(string[] Amount, int[] Item){ 
    // ... 
} 

Sin embargo, esto hará que necesite "vincular" los elementos. Alternativamente crear un "artículo" clase:

public class Item { 
    public string Amount { get; set; } 
    public int Item { get; set; } 
} 

Y

public ActionResult MyAction(IList<Item> items){ 
    // ... 
} 

Y su margen de beneficio debe ser:

<input type="hidden" name="items.Index" value="0" /> 
<input type="text" name="items[0].Amount" id="items[0].Amount"> 
    <select name="items[0].Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 
<input type="hidden" name="items.Index" value="1" /> 
<input type="text" name="items[1].Amount" id="items[1].Amount"> 
    <select name="items[1].Item"> 
     <option value="1">Item 1"</option> 
     <option value="2">Item 2"</option> 
     <option value="3">Item 3"</option> 
    </select> 

Etc ...

+0

Gracias por la respuesta, realmente hice un comentario sobre cómo hacer esto en la respuesta de Spencer. Todo se reducía a que a JQuery no le gustaba [] en los campos de Id. De atributo y nombre, así que cuando fui a cambiarlos, JQuery no haría esto. Tal vez debería publicar sobre JQuery, ya que es una forma más agradable de hacer esto. – dave

12

Pregunta anterior, pero aún ... Puede obtener los valores publicados como una matriz llamando al Request.Form.GetValues o Request.QueryString.GetValues. Por ejemplo:

string[] amounts = Request.Form.GetValues("Amount"); 

Y la matriz amounts contendrá los valores correctos, para que pueda publicar los valores que contengan comas, puntos, lo que sea, y no se preocupe por división/analizarlo.

Por supuesto, si está ejecutando MVC, use el encuadernador para hacerlo. Pero puede usar esto si está usando formularios web, un controlador genérico, etc.

Cuestiones relacionadas