Estoy usando un modelo que contiene una lista como propiedad. Estoy completando esta lista con elementos que obtengo de SQL Server. Quiero que la Lista se oculte en la vista y se pase a la acción POST. Más adelante, es posible que desee agregar más elementos a esta lista con jQuery, lo que hace que una matriz no sea adecuada para la expansión más adelante. Normalmente usarías
@Html.HiddenFor(model => model.MyList)
para lograr esta funcionalidad, pero por alguna razón la Lista en POST siempre es nula.
Pregunta muy simple, ¿alguien sabe por qué MVC se comporta así?
c#
asp.net
asp.net-mvc-3
hidden-field
Anton Smith
fuente
fuente
<input />
s?MyList
contieneHiddenFor
solo se usa para una entrada a la vez.Model.MyList
? Es posible que deba realizar alguna serialización / deserialización en su lista manualmente.Respuestas:
Me encontré con este problema y lo resolví simplemente haciendo lo siguiente:
Al usar un for en lugar de un foreach, el enlace del modelo funcionará correctamente y recogerá todos sus valores ocultos en la lista. Parece la forma más sencilla de resolver este problema.
fuente
@Html.HiddenFor(model => Model.ToGroups[i].RowId)
@Html.EditorFor(model => Model.ToGroups[i].Id)
seguido de@Html.EditorFor(model => Model.ToGroups[i].Description)
la próxima vez, ambos en el bucle for. Y el controlador pudo asignarlo a una lista de los modelos con esos campos. Y para asegurarse de que nada de eso aparezca en la pantalla, simplemente envuélvalo en<div style="display: none;"></div>
for
bucle a esto:for(int i = 0; i < Model.Departments.Count(); i++)
HiddenFor no es como DisplayFor o EditorFor. No funcionará con colecciones, solo valores individuales.
Puede usar el ayudante Serialize HTML disponible en el proyecto MVC Futures para serializar un objeto en un campo oculto, o tendrá que escribir el código usted mismo. Una mejor solución es simplemente serializar un ID de algún tipo y volver a obtener los datos de la base de datos en la devolución.
fuente
Es un truco, pero si
@Html.EditorFor
o@Html.DisplayFor
funciona para su lista, si desea asegurarse de que se envíe en la solicitud de publicación pero no sea visible, puede diseñarlo para usarlodisplay: none;
para ocultarlo, por ejemplo:fuente
¿Qué hay de usar Newtonsoft para deserializar el objeto en una cadena json y luego insertarlo en su campo oculto, por ejemplo ( Model.DataResponse.Entity.Commission es una lista de objetos simples "CommissionRange" como verá en el JSON)
Se renderiza como:
En mi caso, hago algunas cosas de JS para editar el json en el campo oculto antes de volver a publicar
En mi controlador, luego uso Newtonsoft nuevamente para deserializar:
fuente
Html.HiddenFor
está diseñado para un solo valor. Deberá serializar su lista de alguna manera antes de crear el campo oculto.Por ejemplo, si su lista es de tipo cadena, puede unir la lista en una lista separada por comas, luego dividir la lista después de la publicación en su controlador.
fuente
Me acabo de enterar (después de un par de horas de tratar de averiguar por qué los valores del modelo no regresaban al controlador) que los valores ocultos deben seguir al EditorFor.
A menos que esté haciendo algo más mal, esto es lo que encontré. No volveré a cometer el error.
En el contexto de un modelo que contiene una lista de otra clase.
Esto no funcionará:
Donde como esto VOLVERÁ ...
fuente
Comencé a buscar en el código fuente
HiddenFor
y creo que el obstáculo que está viendo es que su objeto complejoMyList
no es implícitamente convertible a tipostring
, por lo que el marco trata suModel
valor comonull
y deja elvalue
atributo vacío.fuente
Puedes echar un vistazo a esta solución .
Coloque solo HiddenFor dentro de EditorTemplate.
Y en tu Vista pon esto:
@Html.EditorFor(model => model.MyList)
Debería funcionar.
fuente
Enfrentó el mismo problema. Sin el bucle for, solo publicó el primer elemento de la lista. Después de recorrer el bucle for, puede mantener la lista completa y publicar con éxito.
fuente
Otra opcion seria:
fuente
El
foreach
bucle en lugar de unfor
bucle podría ser una solución un poco más limpia.fuente
Otra forma posible de solucionar esto sería darle a cada objeto en su Lista una ID, luego usar
@Html.DropDownListFor(model => model.IDs)
y completar una matriz que contenga las ID.fuente
tal vez tarde, pero creé un método de extensión para campos ocultos de la colección (con elementos de tipo de datos simples):
Asi que aqui esta:
El uso es tan simple como:
fuente