2012-02-16 16 views
18

Tôi đang cố gắng để có được quan điểm của mình để đăng một Danh sách quay lại hành động, tuy nhiên nó vẫn giữ nguyên giá trị rỗng.Đăng lên danh sách <modeltype> MVC3

Vì vậy, Mô hình của tôi có Danh sách các đối tượng WeightEntry.

Tập thể dục mẫu

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

WeightEntry Mẫu

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

Xem My chứa ExerciseName và forloop của WeightEntry đối tượng

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

Controller Action (bài viết) Liệu có gì tại chốc lát. Tôi chỉ cố gắng để có được sự ràng buộc làm việc trước khi tôi thêm mã lưu.

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

Tôi đã thấy một vài thủ thuật nhỏ với việc thêm một tử số để tên các yếu tố hình thức được sử dụng trong MVC2 nhưng tôi đã tự hỏi nếu MVC3 là bất kỳ khác nhau? Tôi đã hy vọng nó sẽ tất cả ràng buộc độc đáo với ID là 0 hoặc null nhưng thay vì toàn bộ danh sách là null khi tôi kiểm tra nó sau khi các bài viết hình thức. Bất kỳ trợ giúp được đánh giá cao. Cảm ơn.

Trả lời

39

Thay thế vòng lặp sau:

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

với:

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

hoặc thậm chí tốt hơn, sử dụng biên tập mẫu và thay thế các vòng lặp với:

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

và sau đó xác định một tùy chỉnh mẫu trình soạn thảo sẽ tự động được hiển thị cho từng phần tử của bộ sưu tập Mục nhập ()):

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

Các yếu tố đầu vào được tạo ra sẽ có correct names và bạn sẽ có thể thành công lấy chúng trở lại trong hành động POST của bạn.

+1

Tại sao foreach kết thúc trả về null cho bộ sưu tập? – Coops

+2

@CodeBlend, xem các thuộc tính 'name' của các trường nhập trong HTML được tạo và so sánh nó trong cả hai trường hợp. Sau đó đọc ['bài viết sau'] (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx) và bạn sẽ hiểu tại sao nó hoạt động với' for' và nó không hoạt động với 'foreach'. –

+8

Holy crap - thực sự hiệu quả. Tôi gửi bia ở đâu? –

Các vấn đề liên quan