A passagem de um Controlador de FormCollection e uma IList<T>
-
19-08-2019 - |
Pergunta
Eu tenho um formulário que contém um montão de campos de entrada de dados que será preenchido pelo usuário, incluindo alguns elementos, onde o usuário pode ditar a forma como muitos dos mesmos itens, eles vão entrar.Isso é como está sendo usado em Phil Haack blog de entrada A Associação De Modelo A Uma Lista.
Eu estou com êxito usando o JQuery para criar o extra elementos de formulário, corretamente indexados, etc.O meu problema é a melhor maneira para realmente ler estas dentro do meu Controlador.O Controlador no artigo só espera um objeto, IList<Product>
considerando que o meu Controlador já se espera uma FormCollection form
e agora eu estou tentando também enviar um IList<Itmes>
bem.
Devo acrescentar que este os parâmetros esperados pelo Controlador ou a aceder através do formulário["itens"] ou algo mais?
Visualizar
<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 de
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; };
}
Solução 2
Eu decidi trabalhar exclusivamente com o FormCollection
em vez de turvar as águas com alguns dados a ser transmitidos através do uso de FormCollection
e outros dados que está sendo mapeada para uma Lista de pelo framework.O código abaixo, leva os itens e hidrata o DTO manualmente.Isso funciona muito bem e permite-me fazer algumas outras coisas dentro do meu código que não foram possíveis de mapeamento diretamente a uma 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 )]
});
}
Outras dicas
Você pode simplesmente adicionar o myitem como um parâmetro como assim:
public ActionResult Add(FormCollection form, List<Item> myItem)
{
}
Em seguida, ele se vinculará automaticamente a partir dos dados do formulário e preencherá o parâmetro myitem.
Eu não tentei isso, então você terá que tentar, mas por que não usar o método UpdatEmodel ou TryUpdatemodel? Isso deve se vincular da mesma maneira que passar o ilista para a ação do controlador.
Aquilo é:
public ActionResult Add(FormCollection form)
{
List<Item> items = new List<Item>();
TryUpdateModel(items, form);
}
Não estou no meu computador de desenvolvimento, então não tenho certeza de que funcionará, mas espero que deva. Deixe -me saber se é o que você precisa.
EDIT: Vale a pena notar que, se você estiver usando a estrutura da entidade, encontrei muitos problemas com os métodos UpdateModel e recorri a escrever o meu.