2012-02-16 12 views
18

Estoy tratando de hacer que mi vista vuelva a publicar una lista para la acción, pero sigue apareciendo como nula.Publicando en una lista <modeltype> MVC3

Entonces mi modelo tiene una lista de objetos WeightEntry.

Ejercicio Modelo

public class Exercise 
{ 
    public List<WeightEntry> Entries { get; set; } 
    public int ExerciseID { get; set; } 
    public int ExerciseName { get; set; } 
} 

WeightEntry Modelo

public class WeightEntry 
{ 
    public int ID { get; set; } 
    public int Weight { get; set; } 
    public int Repetition { get; set; } 
} 

Mi Vista contiene el ExerciseName y una forloop de WeightEntry objetos

@model Mymvc.ViewModels.Exercise 
... 
<span>@Model.ExerciseName</span> 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <table class="left weight-record"> 
     <tr> 
      <th>Reps</th> 
      <th>Weight</th> 
     </tr> 
     @foreach (var item in Model.Entries) 
     { 
      <tr> 
       <td> 
        @Html.EditorFor(x => item.Repetition) 
       </td> 
       <td> 
        @Html.EditorFor(x => item.Weight) 
       </td> 
      </tr> 
     } 
    </table> 
    <input type="submit" value="Save" /> 
} 

la acción del controlador (Post) no hace nada en el momento. Solo estoy intentando que el enlace funcione antes de agregar el código de guardado.

[HttpPost] 
public ActionResult WeightEntry(Exercise exercise) 
{ 
    try 
    { 
     //Add code here to save and check isvalid  
     return View(exercise); 
    } 
    catch 
    { 
     return View(exercise); 
    } 
} 

he visto unos pequeños trucos con la adición de un numerador a los nombres de los elementos del formulario utilizados en MVC2 pero me preguntaba si MVC3 era diferente? Esperaba que todo se vincule muy bien con ID's siendo 0 o nulo, pero en cambio toda la lista es nula cuando la inspecciono después de las publicaciones del formulario. Cualquier ayuda es apreciada. Gracias.

Respuesta

39

Reemplazar el siguiente bucle:

@foreach (var item in Model.Entries) 
{ 
    <tr> 
     <td> 
      @Html.EditorFor(x => item.Repetition) 
     </td> 
     <td> 
      @Html.EditorFor(x => item.Weight) 
     </td> 
    </tr> 
} 

con:

@for (var i = 0; i < Model.Entries.Count; i++) 
{ 
    <tr> 
     <td> 
      @Html.EditorFor(x => x.Entries[i].Repetition) 
     </td> 
     <td> 
      @Html.EditorFor(x => x.Entries[i].Weight) 
     </td> 
    </tr> 
} 

o incluso mejor, editor de plantillas de usar y cambiar el bucle con:

@Html.EditorFor(x => x.Entries) 

y luego definir una costumbre plantilla de editor que se representará automáticamente para cada elemento de la colección Entradas ()):

@model WeightEntry 
<tr> 
    <td> 
     @Html.EditorFor(x => x.Repetition) 
    </td> 
    <td> 
     @Html.EditorFor(x => x.Weight) 
    </td> 
</tr> 

Los los elementos de entrada generadas tendrán correct names y usted será capaz a buscar con éxito de nuevo en su acción POST.

+1

¿Por qué el foreach termina devolviendo nulo para la colección? – Coops

+2

@CodeBlend, observe los atributos 'name' de los campos de entrada en el HTML generado y compárelo en ambos casos. Luego lea el ['siguiente artículo'] (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx) y comprenderá por qué funciona con' for' y no funciona con 'foreach'. –

+8

Mierda, eso funcionó. ¿A dónde envío la cerveza? –

Cuestiones relacionadas