asp.net mvc - net - Envío de elementos de formulario con el mismo nombre
webforms vs mvc 2017 (6)
Creo que si tiene múltiples campos llamados Cantidad, los valores estarán delimitados por comas.
Para acceder a cada uno simplemente intente:
string[] amounts = Request.Form["Amount"].Split(new char[] { '','' });
Sin embargo, ten en cuenta que las entradas no se limpian al enviarlas, por lo que si alguien ingresa una coma en el cuadro de texto, se generarán problemas.
Por lo tanto, recomiendo numerarlos.
Tengo un formulario que permite al usuario crear "filas" adicionales usando JQuery (usando .clone) para que puedan decidir la cantidad de la misma información que necesitan enviar. Mi problema es que no puedo encontrar la forma de acceder a estos elementos de formulario dentro de mi controlador.
el formulario que se envía puede verse así
<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 la input
y la selección podría repetirse infinitas veces. Cuando me presento al controlador, estoy usando el 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 y, de ser así, alguien tiene alguna sugerencia sobre cómo podría funcionar?
Gracias por adelantado.
Los numeraría Amount1, Amount2, Amount3, etc.
Puede cambiar el id y el atributo de nombre de la entrada a algo así como "Cantidad [1]", "Importe [2]", "Importe [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.
Terminé dándome cuenta de que ( rubor ) el mecanismo que JQuery usa para encontrar la cadena dentro de la fila clonada (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 ...!
Pregunta anterior, pero aún ... Puede obtener los valores publicados como una matriz llamando a Request.Form.GetValues
o Request.QueryString.GetValues
. Por ejemplo:
string[] amounts = Request.Form.GetValues("Amount");
Y el conjunto de amounts
contendrá los valores correctos, por lo que puede publicar valores que contengan comas, puntos, lo que sea, y no se preocupe por dividirlo / 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.
Verifique la vinculación del modelo a una lista . Su método de acción debe ser:
public ActionResult MyAction(string[] Amount, int[] Item){
// ...
}
Sin embargo, esto hará que necesites "vincular" los elementos. Alternativamente, crea una clase "Artículo":
public class Item {
public string Amount { get; set; }
public int Item { get; set; }
}
Y
public ActionResult MyAction(IList<Item> items){
// ...
}
Y su marcado 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 ...