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; };
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top