2011-01-31 11 views
6

Ciao,ASP.NET MVC 2 ed elenca come valori nascosti?

ho una classe vista che contiene un elenco, questo elenco illustra i file disponibili che l'utente ha caricato (resi con un aiutante html).

Per mantenere questi dati su Submit ho aggiunto il seguente alla vista:

<%: Html.HiddenFor(model => model.ModelView.Files)%> 

Speravo che l'elenco mode.ModelView.Files sarebbe tornato per l'azione su presentare, ma non lo è?

Non è possibile avere un elenco come hiddenfield?

Maggiori informazioni:L'utente presentare un paio di file che viene salvato sul servizio, quando thay salvati sono riferito come GUID ed è questo elenco che viene inviato all'utente di rendere le immagini salvate. L'utente apporta alcune modifiche al modulo e premi invio di nuovo l'elenco delle immagini sarà vuoto quando si arriva all'azione di controllo, perché?

BestRegards

risposta

6

Non è possibile avere una lista come HiddenField?

Ovviamente non è possibile. Un campo nascosto richiede solo un singolo valore stringa:

<input type="hidden" id="foo" name="foo" value="foo bar" /> 

Quindi, se avete bisogno di una lista è necessario più campi nascosti, per ogni elemento della lista. E se quegli oggetti sono oggetti complessi hai bisogno di un campo nascosto per ogni proprietà di ogni elemento della lista.

o una soluzione molto più semplice è per questo campo nascosto per rappresentare un certo identificatore univoco:

<input type="hidden" id="filesId" name="filesId" value="123" /> 

e nella vostra azione di controllo si può usare questo identificatore univoco per recupera nuovamente la vostra collezione da dove ti inizialmente ottenuto.

Un'altra possibilità è quella di mantenere il tuo modello nello Session (solo menzionando la Sessione per la completezza del mio amore per la risposta, ma non è qualcosa che io in realtà raccomanderei di usare).

+0

Perché non raccomandare la sessione?Quale sarebbe la tua raccomandazione per archiviare i dati tra le azioni? e come dovrei ottenere un identificatore uniqe? – Banshee

+1

@SnowJim, i dati sono già memorizzati nel database. Quindi basta interrogare il database per recuperare i dati. Ovviamente per evitare di colpire il database su ogni richiesta è possibile utilizzare il caching, ecc. Cerco di evitare la sessione perché conduce a applicazioni stateful e meno scalabili. Ad esempio, per impostazione predefinita, la sessione viene archiviata in memoria e quando si esegue una server farm sarà necessario scaricarla su un altro archivio (server out-of-process o SAL). –

3

Prima di iniziare, vorrei solo ricordare che questo è un esempio di una delle soluzioni proposte contrassegnate come risposta. Darrin ha capito bene, ecco un esempio di implementazione della soluzione suggerita ...

Ho avuto un problema simile in cui avevo bisogno di memorizzare una lista generica di tipo int in un campo nascosto. Ho provato l'apporach standard che sarebbe:

<%: Html.HiddenFor(foo => foo.ListOfIntegers) %> 

Ciò tuttavia causerebbe ed eccezione. Così ho provato il suggerimento di Darrin e sostituito il codice sopra con questo:

<% 
foreach(int fooInt in Model.ListOfIntegers) 
{ %> 
<%: Html.Hidden("ListOfIntegers", fooInt) %> 
<% } %> 

Questo ha funzionato come un fascino per me. Grazie Darrin.