2010-04-25 30 views
5

OK vì vậy tôi có chế độ xem "Chi tiết" của Khách hàng được nhập mạnh sẽ lấy Mẫu đối tượng khách hàng.ASP.NET MVC/LINQ: Cách thích hợp để lặp qua Linq.EntitySet trong Chế độ xem là gì?

Tôi đang sử dụng LINQ to SQL và mọi Khách hàng đều có thể có nhiều khoảng cách (đỗ xe).

Đây là mối quan hệ FK trong cơ sở dữ liệu để mô hình Khách hàng được tạo LINQ của tôi có bộ sưu tập "Không gian". Tuyệt quá!

Dưới đây là một đoạn mã từ CustomerRepository tôi, nơi tôi lặp qua chỗ đậu xe của khách hàng để xóa tất cả các khoản thanh toán, không gian và sau đó cuối cùng là khách hàng:

public void Delete(Customer customer) 
{ 
    foreach (Space s in customer.Spaces) 
     db.Payments.DeleteAllOnSubmit(s.Payments); 
    db.Spaces.DeleteAllOnSubmit(customer.Spaces); 
    db.Customers.DeleteOnSubmit(customer); 
} 

mọi thứ hoạt động như mong đợi!

Bây giờ trong "Chi tiết" của tôi xem tôi muốn để cư một bảng với Spaces của khách hàng:

<% foreach (var s in Model.Spaces) 
    { %> 
    <tr> 
     <td><%: s.ID %></td> 
     <td><%: s.InstallDate %></td> 
     <td><%: s.SpaceType %></td> 
     <td><%: s.Meter %></td> 
    </tr> 
<% } %> 

tôi nhận được lỗi sau:

foreach statement cannot operate on variables of type 'System.Data.Linq.EntitySet' because 'System.Data.Linq.EntitySet' does not contain a public definition for 'GetEnumerator'

Cuối cùng, nếu tôi thêm chút này mã cho một phần Khách hàng của tôi và sử dụng foreach trong chế độ xem để lặp qua ParkingSpaces mọi thứ hoạt động như mong đợi:

public IEnumerable<Space> ParkingSpaces 
{ 
    get 
    { 
     return Spaces.AsEnumerable(); 
    } 
} 

Vấn đề ở đây là tôi không muốn lặp lại bản thân mình. Tôi cũng nghĩ rằng tôi có thể sử dụng một ViewModel để vượt qua một bộ sưu tập Spaces để xem, tuy nhiên LINQ đã infers và tạo ra các Spaces bất động sản trên mô hình khách hàng vì vậy tôi nghĩ rằng nó sẽ được sạch sẽ để chỉ sử dụng đó.

Tôi thiếu điều gì đó đơn giản hoặc tôi đang tiếp cận điều này không chính xác?

Cảm ơn!

+0

Chế độ xem của bạn có được nhập mạnh vào 'IEnumerable ' không? Nếu không, đó có lẽ là lý do tại sao bạn không thể liệt kê nó, mà không có chút mã trợ giúp. –

+0

Chế độ xem của tôi được nhập mạnh vào Inherits = "System.Web.Mvc.ViewPage " Có lẽ tôi chưa đủ rõ ràng, nhưng chế độ xem cung cấp chi tiết tài khoản của Khách hàng. Khách hàng có bất kỳ số lượng không gian nào cũng sẽ được hiển thị trên trang này. Vì vậy, tôi không muốn chỉ là một danh sách các Không gian, tôi muốn có một cái nhìn chi tiết về một tài khoản Khách hàng bao gồm các Không gian của Khách hàng. –

Trả lời

14

Xin lỗi nếu Im hơi muộn trả lời câu hỏi này nhưng phương pháp giải quyết chính xác vấn đề của bạn là thêm tham chiếu assembly vào tệp web.config của bạn để chế độ xem có thể truy cập phương thức GetEnumerator(). Bạn có thể làm điều này bằng cách sử dụng chuỗi tham chiếu assembly được cung cấp trong lỗi compliation trang. ví dụ

<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

+0

Điều này làm việc cho tôi. – Rob

+0

Điều này làm việc cho tôi quá, có vẻ câm rằng nó không xảy ra theo mặc định –

+0

Làm thế nào điều này sẽ thay đổi câu trả lời cho một ứng dụng web ASP.Net MVC bằng cách sử dụng công cụ xem Razor? – beaudetious

1

Có hai cách bạn có thể làm điều đó, ngoài phương pháp trợ giúp nhỏ của bạn.

Bạn có thể kế thừa một IEnumerable của lớp học của bạn trong trang:

<%@ Page Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Space>>" %> 

<% foreach (var item in Model) 
    { 

Hoặc bạn có thể cast đối tượng thực thể của bạn để một IEnumerable:

<% foreach (var item in Model.Spaces as IEnumerable<Space>) 
    { 
+0

Đối với tùy chọn đầu tiên: Như đã đề cập trong bình luận của tôi cho bài viết gốc của tôi, tôi không tìm cách chỉ định danh sách Spaces, nhưng hiển thị chi tiết thông tin tài khoản mô hình đối tượng khách hàng trong đó mô hình đối tượng khách hàng chứa một EntitySet các khoảng trắng. Đối với tùy chọn thứ hai: Tôi đã thử truyền trong báo cáo foreach, tuy nhiên tôi nhận được lỗi sau: "Không thể chuyển đổi loại ngầm 'System.Data.Linq.EntitySet ' thành 'đối tượng'" - Tôi nghĩ rằng việc sử dụng cách tiếp cận Chế độ xem là cách để đi, nhưng tôi không muốn sao chép bản thân mình. –

1
  • Trước hết sử dụng Xem Models thay vì truy cập trực tiếp vào DTO được ưu tiên là . (Sử dụng Automapper cho việc này)

  • Thứ hai, mạnh mẽ gõ quan điểm của bạn để Xem Model và trong Xem các mẫu có một Danh sách IEnumerable hoặc thông qua để xem , sau đó bạn có thể lặp qua nó

+0

Tôi làm cách nào để tạo Mô hình chế độ xem mà không cần sao chép bộ sưu tập của Không gian? Tôi đang sử dụng hướng dẫn NerdDinner làm mẫu và ví dụ về Mô hình Xem là một lớp có mô hình đối tượng khách hàng và cũng bổ sung thêm các thuộc tính bổ sung để bổ sung mô hình ban đầu đang được truyền qua. Trong trường hợp này, tôi sẽ kết thúc với một EntitySet của Spaces cũng như một bộ sưu tập IEnumerable riêng biệt. Bạn có thể chỉ cho tôi theo hướng của một tài nguyên sẽ giải thích cách thích hợp để cấu trúc Mô hình Xem này không? Cảm ơn! –

+0

Quy tắc chung là tất cả thông tin mà chế độ xem của bạn cần sẽ có trong Mô hình xem mà bạn vượt qua, do đó, mô hình chế độ xem này là một thiết kế riêng được tạo và sẽ được lấp đầy dữ liệu từ DTO hoặc DTO. Trong trường hợp bạn muốn vượt qua một IEnumerable, sau đó mô hình xem sẽ có một IEnumerable trong nó –

1

Chỉ cần thêm một tham chiếu đến System.Data.Linq để dự án của bạn.

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