111 messaggi dal 07 novembre 2007
Salve
ho un'applicazione MVC e ho un form d'inserimento in cui ho un model con una proprietà che è una lista che voglio far valorizzare dinamicamente il numero degli elementi che quando poi inserirò saranno inviati nel model all'action che li inserirà. Mi potreste postare un esempio?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Mariano,
si può fare, perché il Model Binder di MVC è in grado di assemblare una lista di oggetti partendo dai dati che arrivano dal form.

Quando un form viene inviato, il server riceve una collezione "piatta" di semplici coppie chiave-valore in formato stringa, come per esempio Nome=Mario e Cognome=Rossi.
Il ModelBinder riesce comunque a ricreare un completo grafo di oggetti, perché i nomi delle chiavi seguono una speciale convenzione, che posiziona precisamente ogni valore all'interno della gerarchia.

marianoross ha scritto:

ho un model con una proprietà che è una lista

Ok, quindi abbiamo un modello che ha una proprietà di tipo lista, che contiene degli altri oggetti che hanno a loro volta delle proprietà.
Se volessi creare una textbox per la modifica della proprietà di uno di questi oggetti della lista, dovrei fare qualcosa come:
<input type="text" name="Lista[0].Proprieta" value="" />

La cosa importante è valorizzare correttamente il name del campo input: vedi che "Lista[0].Proprieta" indica proprio la posizione nella gerarchia degli oggetti.

Un output simile ti viene generato dagli helper methods come EditorFor.
for (var i = 0; i < Model.Lista.Count(); i++) {
 <div>
    @Html.EditorFor(m => m.Lista[i].Proprieta) 
 </div>
}

Arrivo a rispondere alla tua domanda: devi solo produrre dei campi input che abbiano un opportuno attributo name. Se non vuoi sbagliare, puoi prendere spunto dall'output HTML che verrebbe generato da EditorFor.

La seconda questione riguarda il come produrre dinamicamente lato client questo HTML.
Puoi usare il javascript e i suoi metodi di manipolazione del DOM o i metodi di jQuery, oppure usare una libreria client-side di templating, che in questo caso ti darebbe un grosso aiuto.

Ecco un esempio che sfrutta una di quelle librerie: KnockoutJS.
http://jsfiddle.net/sSE65/1/

ciao,
Moreno
Modificato da BrightSoul il 22 luglio 2014 21.44 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.