Pregunta

Tengo un formulario que contiene un montón completo de campos de entrada de datos que completará el usuario, incluidos algunos elementos en los que el usuario puede dictar cuántos de los mismos elementos ingresarán. Esto es como se está utilizando en la entrada del blog de Phil Haack Modelo de enlace a una lista .

Estoy usando con éxito JQuery para crear los elementos de formulario adicionales, indexados correctamente, etc. Mi problema es la mejor manera de leerlos realmente en mi controlador. El controlador en el artículo solo espera un objeto, IList < Product > mientras que mi controlador ya espera un FormCollection form y ahora estoy tratando de enviarle también un IList < ; Itmes > también.

¿Debo agregar esto a los parámetros esperados por el Controlador o acceder a través del formulario [" items "] o algo más?

View

<form action="/MyItems/Add" method="post">
   <input type="text" name="Title" value="" />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <input id="item[0].Name" name="item[0].Name" type="text" value="" />

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <input id="item[1].Name" name="item[1].Name" type="text" value="" />
</form>

Controlador

public ActionResult Add(FormCollection form)
{
    string Title = form["Title"];
    List<Item> Items = form["items"].ToList();
}

DTO

public class Item()
{
    int Amount {get; set; };
    string Name {get; set; };
}
¿Fue útil?

Solución 2

He decidido trabajar exclusivamente con FormCollection en lugar de enturbiar las aguas con el paso de algunos datos usando FormCollection y otros datos que la Map asigna a una Lista marco de referencia. El siguiente código toma los elementos e hidrata el DTO manualmente. Esto funciona muy bien y me permite hacer otras cosas dentro de mi código que no fueron posibles asignar directamente a una Lista.

List<Item> itemList = new List<Item>();
int i = 0;

while ( form["item[" + i + "].Amount"] != null)
{
    itemList.Add(new Item()
        {
            Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i )]),
            Name = form[String.Format("item[{0}].Name",i )]
        });
}

Otros consejos

Puede agregar myItem como un parámetro así:

public ActionResult Add(FormCollection form, List<Item> myItem)
{
}

Luego se enlazará automáticamente a partir de los datos del formulario y completará el parámetro myItem.

No he probado esto, así que tendrás que intentarlo, pero ¿por qué no usar el método UpdateModel o TryUpdateModel? Esto debería vincularse de la misma manera que pasar la IList a la acción del controlador.

Eso es:

public ActionResult Add(FormCollection form)
{
    List<Item> items = new List<Item>();
    TryUpdateModel(items, form);
}

No estoy en mi computadora de desarrollo, así que no estoy seguro de que funcione, pero espero que así sea. Avísame si es lo que necesitas.

EDITAR: Vale la pena señalar que si está utilizando el marco de la entidad, me he encontrado con muchos problemas con los métodos UpdateModel y he recurrido a escribir el mío.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top