2012-02-16 10 views
18

Sto cercando di ottenere il mio punto di vista per pubblicare un elenco di nuovo all'azione, ma continua a venire come nulla.Inserimento in un elenco <modeltype> MVC3

Quindi il mio modello ha un elenco di oggetti WeightEntry.

Esercizio Modello

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

WeightEntry Modello

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

My View contiene l'ExerciseName e un forloop di WeightEntry oggetti

@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" /> 
} 

L'azione Controller (Post) Non fa niente alla momento. Sto solo cercando di far funzionare il binding prima di aggiungere il codice di salvataggio.

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

Ho visto un paio di piccoli trucchi con l'aggiunta di un numeratore ai nomi degli elementi di forma utilizzati in MVC2 ma mi chiedevo se MVC3 era diverso? Speravo che tutto si sarebbe combinato bene con ID 0 o null, ma invece l'intero elenco è nullo quando lo controllo dopo i post del modulo. Qualsiasi aiuto è apprezzato. Grazie.

risposta

39

Sostituire il seguente ciclo:

@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, meglio ancora, utilizzare i modelli redattore e sostituire il ciclo con:

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

e quindi definire un costume modello di editor che verrà automaticamente visualizzato per ciascun elemento della raccolta di voci (~/Views/Shared/EditorTemplates/WeightEntry.cshtml):

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

Gli elementi di input generati avranno correct names e sarete in grado di recuperare con successo di nuovo nella vostra azione POST.

+1

Perché il foreach finisce per restituire nulla per la raccolta? – Coops

+2

@CodeBlend, osserva gli attributi 'name' dei campi di input nell'HTML generato e li confronta in entrambi i casi. Poi leggi il [seguente articolo] (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx) e capirai perché funziona con 'for' e non funziona con 'foreach'. –

+8

Santa merda - che funzionava davvero. Dove spedisco la birra? –

Problemi correlati