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?MyListcontieneHiddenForsolo 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>forbucle 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.EditorForo@Html.DisplayForfunciona 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.HiddenForestá 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
HiddenFory creo que el obstáculo que está viendo es que su objeto complejoMyListno es implícitamente convertible a tipostring, por lo que el marco trata suModelvalor comonully deja elvalueatributo 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
foreachbucle en lugar de unforbucle 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