Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

124
Views
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.

about 4 years ago · Santiago Trujillo
1 answers
Answer question

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> }
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!