2012-02-16 15 views
18

Próbuję uzyskać mój pogląd, aby opublikować listę z powrotem do akcji, ale nadal pojawia się jako null.Delegowanie do listy <modeltype> MVC3

Tak więc mój model ma listę obiektów WeightEntry.

model Ćwiczenia

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

WeightEntry model

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

moim zdaniem zawiera ExerciseName i forloop z WeightEntry obiektów

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

Kontroler Akcja (Post) Czy nic u za chwilę. Po prostu próbuję uzyskać działanie wiążące przed dodaniem kodu zapisu.

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

Widziałem kilka małych sztuczek z dodaniem licznik nazw elementów formularza, wykorzystywanych w MVC2 ale zastanawiałem się, czy MVC3 było inaczej? Miałem nadzieję, że wszystko będzie dobrze się wiązało z identyfikatorem 0 lub zerowym, ale zamiast tego cała lista ma wartość zerową, gdy sprawdzam ją po wpisie formularza. Każda pomoc jest doceniana. Dzięki.

Odpowiedz

39

wymienić następujące pętli:

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

z:

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

lub nawet lepiej, używać szablonów edytora i zastąpić pętlę z:

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

a następnie zdefiniować niestandardową szablon edytora, który będzie automatycznie renderowany dla każdego elementu kolekcji Entries ()):

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

The wygenerowane elementy wejściowe będą miały correct names i będzie w stanie skutecznie sprowadzić je z powrotem w swoim działaniu POST.

+1

Dlaczego na odwrocie kończy się zwracanie wartości zerowej dla kolekcji? – Coops

+2

@CodeBlend, spójrz na atrybuty 'name' pól wejściowych w wygenerowanym kodzie HTML i porównaj je w obu przypadkach. Następnie przeczytaj ["następujący artykuł"] (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx) i zrozumiesz, dlaczego działa z 'dla' i nie działa z 'foreach'. –

+8

Holy crap - to faktycznie zadziałało. Gdzie mam wysłać piwo? –

Powiązane problemy