una - ¿Cómo maneja la salida de un formulario generado dinámicamente en ASP.NET MVC?
search asp net core (4)
Dependiendo de los encuadernadores que esté utilizando, esto debería funcionar:
<%var i = 0;
foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
<%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
<%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
<%=product.Name%><br/>
<%}%>
... lo que dará como resultado HTML algo como esto (observe la notación de matriz en los nombres):
<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget
... y el método del controlador que maneja la publicación:
public ActionResult SelectProducts(IList<ProductSelection> products)
{
...
}
Tras el enlace, el parámetro de productos contendrá dos instancias de ProductSelection.
Una advertencia es que no he usado el nuevo enlace predeterminado para objetos complejos. Más bien, estoy usando NameValueDeserializer o CastleBind, ambos de MvcContrib. Ambos se comportan de esta manera. Supongo que el enlace en la versión Beta funcionará de la misma manera.
Supongamos que crea un formulario con ASP.NET MVC que tiene una cantidad dinámica de elementos de formulario.
Por ejemplo, necesita una casilla de verificación para cada producto, y la cantidad de productos cambia día a día.
¿Cómo manejarías que los datos del formulario se vuelvan a enviar al controlador? No puede configurar parámetros en el método de acción porque no sabe cuántos valores de formulario van a regresar.
Dependiendo de sus datos, podría generar un ''CheckboxList'' (que ya no es posible en las versiones más nuevas) y usar un parámetro string[]
, o podría configurar múltiples formularios y simplemente modificar la acción.
La respuesta de Craig ... eso es más seguro. Hay peculiaridades al publicar múltiples elementos de formulario con el mismo nombre. Añadiría que sería inteligente ajustar la lógica que hace que la "colección" de controles sea similar a WebForms. Los formularios web anteponen el nombre del control del contenedor y agrega un índice. Por ejemplo, en un Repetidor, los elementos del formulario dentro se nombrarían (algo así como) RepeaterName_Element1, RepeaterName_Element2. Cuando vaya a obtener los elementos, debe usar FindControl o algo por el estilo.
Simplemente déle a cada casilla de verificación un valor de nombre único:
<input class="approveCheck" id="<%= "approveCheck" + recordId %>"
name="<%= "approveCheck" + recordId %>" type="checkbox" />
A continuación, analice la lista de valores de formulario en la Acción, luego de enviar:
foreach (var key in Request.Form.Keys)
{
string keyString = key.ToString();
if (keyString.StartsWith("approveCheck", StringComparison.OrdinalIgnoreCase))
{
string recNum = keyString.Substring(12, keyString.Length - 12);
string approvedKey = Request.Form["approveCheck" + recNum];
bool approved = !String.IsNullOrEmpty(approvedKey);
// ...
No necesita pasar los valores del formulario como argumentos; solo puede obtenerlos de Request.Form.
Otra opción: escribir una carpeta modelo para cambiar la lista en un tipo personalizado para el envío de formularios.