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:
MyViewModel , la propiedad SubViewModels es nula.IEnumerable<SubViewModel> , el modelo es nulo.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.
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> }