Domanda

Ho un modulo che contiene un intero mucchio di campi di immissione dati che saranno completati dall'utente, inclusi alcuni elementi in cui l'utente può dettare quanti degli stessi elementi inseriranno. Questo è come viene usato nel blog di Phil Haack Model Binding To A List .

Sto usando con successo JQuery per creare elementi del modulo extra, correttamente indicizzati, ecc. Il mio problema è il modo migliore per leggerli effettivamente nel mio controller. Il controller nell'articolo si aspetta solo un oggetto, IList < Product > mentre il mio controller si aspetta già un modulo FormCollection e ora sto cercando di inviargli anche un IList < ; Itmes > .

Dovrei aggiungere questo ai parametri previsti dal Titolare o accedendo tramite il modulo [" articoli "] o qualcos'altro?

Visualizza

<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>

Regolatore

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; };
}
È stato utile?

Soluzione 2

Ho deciso di lavorare esclusivamente con il FormCollection piuttosto che confondere le acque con alcuni dati passati attraverso FormCollection e altri dati mappati in un elenco dal struttura. Il codice seguente prende gli articoli e idrata il DTO manualmente. Funziona bene e mi permette di fare alcune altre cose all'interno del mio codice che non erano possibili mappare direttamente su un Elenco.

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 )]
        });
}

Altri suggerimenti

Potresti semplicemente aggiungere myItem come parametro in questo modo:

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

Quindi si legherà automaticamente ai dati del modulo e popolerà il parametro myItem.

Non l'ho provato, quindi dovresti provarlo, ma perché non utilizzare il metodo UpdateModel o TryUpdateModel? Ciò dovrebbe legarsi allo stesso modo del passaggio dell'IList all'azione del responsabile del trattamento.

Cioè:

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

Non sono al mio computer di sviluppo, quindi non sono sicuro che funzionerà, ma mi aspetto che dovrebbe. Fammi sapere se è quello che ti serve.

MODIFICA: vale la pena notare che se si utilizza il framework di entità, ho riscontrato molti problemi con i metodi UpdateModel e ho fatto ricorso alla mia scrittura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top