Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

128
Vistas
Ajax BeginForm of list devuelve solo el primer elemento del modelo o nulo

Estoy tratando de llamar a una acción con un ajax-beginform.

Este es mi modelo:

 public class MyViewModel { public List<SubViewModel> SubViewModels {get;set;} } public class SubViewModel { public string Name {get;set;} public int Age {get;set;} public bool Active {get;set;} }

Mi vista se ve así: (Estoy iterando sobre todos los SubViewModel-Items, y quiero recuperarlos más tarde en mi DoAction-Method)

 @model MyViewModel @using (Ajax.BeginForm("DoAction", "MyController", null, new AjaxOptions() { HttpMethod = "Post" }, new { @class = "search-form", enctype = "multipart/form-data" })) { <table class="table"> <thead> <tr> <th>Name</th> <th>Age</th> <th>Active</th> </tr> </thead> <tbody> @foreach (var item in Model.SubViewModels) { <tr> <td><input type="text" name="Name" value="@item.Name" /></td> <td><input type="text" name="Age" value="@item.Age" /></td> <td><input type="checkbox" name="Active" value="@item.Active" /></td> </tr> } </tbody> </table> <input type="submit" value="OK" /> }

Y esta es mi acción:

 [System.Web.Mvc.HttpPost] public async Task DoAction([FromBody] MyViewModel model) { // here model is null }

Siempre llega al punto de interrupción en DoAction pero:

  • si el tipo de modelo es MyViewModel , la propiedad SubViewModels es nula.
  • si el tipo de modelo es IEnumerable<SubViewModel> , el modelo es nulo.
  • si el tipo de modelo es SubViewModel , el primer conjunto de datos está en el parámetro.

Así que supongo que el parámetro correcto para esta acción ajax es del tipo SubViewModel .

Pero necesito MyViewModel o IEnumerable<SubViewModel> para obtener todos los elementos de los modelos enumerados.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Debe nombrar sus entradas de manera que el modelbinder pueda vincular los datos de la publicación de manera adecuada. Como lo tiene ahora, cada elemento de la lista se publica a través de los mismos nombres de propiedad: Name , Age y Active . Lo que realmente necesita son nombres como SubViewModels[N].Name , donde N es un valor de índice entero. La forma más fácil de hacer esto es usar los ayudantes de HTML para generar sus entradas, y también necesitará usar un bucle for , en lugar de foreach :

 @for (var i = 0; i < Model.SubViewModels.Count(); i++) { <tr> <td>@Html.TextBoxFor(m => m.SubViewModels[i].Name)</td> <td>@Html.TextBoxFor(m => m.SubViewModels[i].Age)</td> <td>@Html.CheckBoxFor(m => m.SubViewModels[i].Name)</td> </tr> }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda