2011-01-31 10 views
6

Hola,ASP.NET MVC 2 y las listas como valores ocultos?

tengo una clase de vista que contiene una lista, esta lista se explican los archivos que el usuario haya subido (prestados con un asistente de HTML).

Para mantener estos datos en enviar He añadido lo siguiente a la vista:

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

Tenía la esperanza de que la lista mode.ModelView.Files sería devuelto a la acción en enviar pero no lo es?

¿No es posible tener una lista como hiddenfield?

Más información:El usuario envia un par de archivos que se guardan en el servicio, cuando parecían salvados se refiere como GUID y es esta lista que se envía de vuelta al usuario a hacer que las imágenes guardadas. El usuario realiza algunos cambios en el formulario y pulsa enviar de nuevo; la lista de imágenes estará vacía al llegar a la acción de control, ¿por qué?

BestRegards

Respuesta

6

¿No es posible tener una lista como HiddenField?

Por supuesto que no es posible. Un campo oculto toma sólo un único valor de cadena:

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

Así que si usted necesita una lista necesita varios campos ocultos, para cada elemento de la lista. Y si esos elementos son objetos complejos, necesita un campo oculto para cada propiedad de cada elemento de la lista.

o una solución mucho más simple es para este campo oculto para representar algún identificador único:

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

y en su acción de controlador que usaría este identificador único para refetch su colección desde donde quiera que inicialmente consiguió.

Otra posibilidad es que su modelo permanezca en el Session (solo menciono la Sesión por la integridad de mi respuesta, pero no es algo que realmente recomiendo usar).

+0

¿Por qué no recomendaría la sesión?¿Cuál sería su recomendación para almacenar datos entre las acciones? y ¿cómo debería obtener un identificador único? – Banshee

+1

@SnowJim, los datos ya están almacenados en su base de datos. Así que solo consulta la base de datos para volver a buscar los datos. Por supuesto, para evitar golpear la base de datos en cada solicitud, podría utilizar el almacenamiento en caché, etc. Intento evitar la sesión porque conduce a aplicaciones con estado y menos escalables. Por ejemplo, de forma predeterminada, la sesión se almacena en la memoria y cuando se está ejecutando en una granja de servidores, tendrá que descargarla a otro almacenamiento (fuera de proceso o servidor SAL). –

3

Antes de comenzar me gustaría mencionar que este es un ejemplo de una de las soluciones propuestas que se marcó como la respuesta. Darrin lo hizo bien, aquí hay un ejemplo de una implementación de la solución sugerida ...

Tuve un problema similar cuando necesitaba almacenar una lista genérica de tipo int en un campo oculto. Probé la apporach estándar que serían:

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

Eso sería sin embargo la causa y excepción. Así que probé la sugerencia de Darrin y reemplacé el código anterior con esto:

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

Esto funcionó como un encanto para mí. Gracias Darrin.

Cuestiones relacionadas