2011-06-21 31 views
6

Tôi hy vọng tôi không thiếu một thứ gì đó cực kỳ rõ ràng ở đây nhưng có lý do gì không?MVC3 Chất kết dính mô hình dao cạo và các bộ sưu tập được thừa hưởng

Cho phép nói rằng tôi muốn hiển thị danh sách được phân trang và hiển thị hộp tổ hợp và thêm nút ở trên nó (xử lý các danh sách đơn giản). lớp tham gia sẽ như thế nào:

public class PagedList<T> : List<T> 
{ 
    public int TotalCount { get; set; } 
} 

Và sau đó là một mô hình điểm cho rằng trông giống như:

public class MyViewModel : PagedList<ConcreteModel> 
{ 
    public IEnumerable<ChildModel> List { get; set; } 
    public int? SelectedChildModelId { get; set; } 
} 

Vì vậy, trong giao diện (Razor):

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(model => model.SelectedChildModelId, new SelectList(Model.List, "ChildModelId", "DisplayName")) 
} 

Và bộ điều khiển HttpPost hành động:

public ActionResult(MyViewModel viewModel) 
{ 
    ... 
} 

Ở trên sẽ c ause viewModel trong ActionResult là null. Có một lời giải thích hợp lý cho nó? Từ những gì tôi có thể nói nó chỉ cụ thể để xem các mô hình kế thừa từ các bộ sưu tập.

Tôi biết tôi có thể làm việc đó với chất kết dính tùy chỉnh nhưng các thuộc tính liên quan là các loại nguyên thủy và thậm chí không có bất kỳ generics hoặc thừa kế nào.

Tôi đã làm lại các mô hình chế độ xem để có loại bộ sưu tập được kế thừa làm thuộc tính và khắc phục sự cố. Tuy nhiên, tôi vẫn gãi đầu vì sao chất kết dính lại vỡ ra. Bất kỳ ý kiến ​​xây dựng nào được đánh giá cao.

+0

Tôi đã gặp khó khăn đối với các mô hình chế độ xem khai báo thuộc tính có loại được thừa kế bộ sưu tập thay vì kế thừa từ một loại vì không tìm thấy giải pháp khả thi nào khác. Vấn đề duy nhất tôi có với phương pháp này là nó phức tạp những thứ cho AutoMapper kể từ khi tài sản bây giờ đã được đặt rõ ràng thay vì được tự động ánh xạ. –

+0

Câu trả lời tại [Stack Overlow] (http://stackoverflow.com/questions/5762302/why-cant-my-views-model-bind-with-my-generic-viewmodel-which-implements-an-inte) trông đầy hứa hẹn. Hmmm, Covariants - không bao giờ được sử dụng trước –

Trả lời

0

Đôi khi, mô hình ràng buộc với bộ sưu tập hoạt động tốt hơn nếu dữ liệu trong bài đăng biểu mẫu được định dạng khác nhau.

Tôi sử dụng plugin được gọi là postify.

http://www.nickriggs.com/posts/post-complex-javascript-objects-to-asp-net-mvc-controllers/

+1

Cảm ơn Devin. Chắc chắn một plugin thú vị nhưng trong trường hợp này nó không có gì làm với javascript. Thông thường, tôi muốn tất cả các ứng dụng web của tôi hoạt động không có JavaScript và chỉ sử dụng nó làm nâng cao. Trong trường hợp này đó là vấn đề của MVC3 cung cấp chất kết dính không biết làm thế nào để làm việc với các bài viết mô hình bộ sưu tập.Những gì tôi đang tìm kiếm là một cách để cấu trúc mô hình xem hoặc kế thừa từ bộ sưu tập cơ sở chính xác là nó được ràng buộc chính xác. –

1

Để trả lời câu hỏi của riêng tôi: Tất cả các mô hình của tôi có bất cứ điều gì để làm với các bộ sưu tập không còn kế thừa từ danh sách chung hoặc tương tự nhưng thay vì có một tài sản của các loại bộ sưu tập yêu cầu. Điều này hoạt động tốt hơn nhiều vì khi hiển thị, bạn có thể sử dụng

@Html.EditorFor(m => m.CollectionProperty) 

Và tạo trình chỉnh sửa tùy chỉnh trong Chế độ xem/Chia sẻ/EditorTemplates cho loại chứa. Nó cũng hoạt động tốt đẹp với chất kết dính mô hình vì tất cả các mục riêng lẻ từ bộ sưu tập có được một chỉ mục và chất kết dính có thể tự động liên kết nó khi được gửi.

Bài học kinh nghiệm: nếu bạn dự định sử dụng các mô hình trong chế độ xem, không được kế thừa từ các loại bộ sưu tập.

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