2010-04-25 8 views
5

OK, więc mam ściśle wpisany widok "Szczegóły" klienta, który przyjmuje Model obiektu Klienta.ASP.NET MVC/LINQ: Jaki jest właściwy sposób na iterowanie przez Linq.EntitySet w widoku?

Używam LINQ do SQL i każdy Klient może mieć wiele (parking) Spacji.

Jest to relacja FK w bazie danych, więc mój model klienta generowany przez LINQ ma kolekcję "Spaces". Wspaniały!

Oto fragment kodu z mojego CustomerRepository gdzie iterację postojowych Klienta, aby usunąć wszelkie płatności, spacji, a następnie ostatecznie klient:

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); 
} 

wszystko działa zgodnie z oczekiwaniami!

Teraz w moim „Szczegóły” widzenia chcę wypełnić tabelę ze spacjami Klienta:

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

pojawia się następujący błąd:

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'

Wreszcie, jeśli dodać ten bit kod do mojej częściowej klasy klienta i użyj foreach w celu iteracji poprzez ParkingSpaces wszystko działa zgodnie z oczekiwaniami:

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

Problem polega na tym, że nie chcę się powtarzać. Pomyślałem także, że mogę użyć ViewModel do przekazania kolekcji Spaces do widoku, jednak LINQ już zawiera i tworzy właściwość Spaces w modelu klienta, więc myślę, że byłoby najczystsze po prostu użyć tego.

Brakuje mi czegoś prostego lub podchodzę do tego niepoprawnie?

Dzięki!

+0

Czy Twój widok został mocno wpisany w "IEnumerable "? Jeśli tak nie jest, to prawdopodobnie dlatego nie można go wyliczyć, bez tego trochę kodu pomocnika. –

+0

Mój widok jest mocno wpisany w Dziedziczenie = "System.Web.Mvc.ViewPage " Być może nie byłam wystarczająco czytelna, ale widok zawiera szczegóły konta klienta. Klient ma dowolną liczbę Spacji, które również powinny być wyświetlane na tej stronie. Nie chcę więc tylko listy przestrzeni, chcę mieć szczegółowy widok konta klienta, w tym przestrzeni klienta. –

Odpowiedz

14

Przepraszam, jeśli jestem trochę za późno, odpowiadając na to, ale właściwą metodą rozwiązania problemu jest dodanie odwołania do zestawu do pliku web.config, aby widok mógł uzyskać dostęp do metody GetEnumerator(). Można to zrobić, korzystając z ciągu referencyjnego zestawu podanego w błędzie kompliacji strony. np

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

+0

To działało dla mnie. – Rob

+0

To działało również dla mnie, wydaje się głupie, że domyślnie się nie dzieje –

+0

Jak zmieni się ta odpowiedź w przypadku aplikacji sieci web ASP.Net MVC używającej mechanizmu widoku maszynki Razor? – beaudetious

1

Są dwa sposoby na to, poza twoją małą metodą pomocnika.

Można odziedziczyć IEnumerable swojej klasie na stronie:

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

<% foreach (var item in Model) 
    { 

Albo można oddać swój obiekt jednostki do IEnumerable:

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

Pierwsza opcja: Jak wspomniano w moim komentarzu do mojego oryginalnego wpisu, nie chcę po prostu wyświetlać Spacji, ale wyświetlać szczegółowe informacje o koncie modelu obiektu klienta, w którym model obiektu klienta zawiera zestaw jednostek przestrzeni. Dla drugiej opcji: Próbowałem rzucić w instrukcji foreach, jednak pojawia się następujący błąd: "Nie można niejawnie przekonwertować typu" System.Data.Linq.EntitySet "na" obiekt "" - Myślę, że używanie metody View Model jest rozwiązaniem, ale nie chcę się duplikować. –

1
  • przede wszystkim z wykorzystaniem Zobacz Models zamiast bezpośredniego dostępu do DTO jest preferowany . (Wykorzystanie Automapper do tego)

  • drugie, zdecydowanie wpisać swoje poglądy na widoku modelu w widoku modelu mają IEnumerable lub Lista przekazany do widoku , można iterację nim

+0

Co zrobić, aby utworzyć model widoku bez duplikowania kolekcji przestrzeni? Używam samouczka NerdDinner jako szablonu, a przykład modelu widoku jest klasą, która przyjmuje model obiektu klienta, a także dodaje dodatkowe właściwości w celu uzupełnienia oryginalnego modelu, który jest przekazywany. W tym przypadku otrzymam zbiór EntitySet of Spaces oraz oddzielną kolekcję IEnumerable . Czy możesz skierować mnie w stronę zasobu, który wyjaśniłby prawidłowy sposób struktury tego modelu widoku? Dzięki! –

+0

Zasada jest taka, że ​​wszystkie informacje, których potrzebuje Twój widok, będą zawarte w Modelu widoku, który przekazujesz, więc ten model widoku jest dostosowany do niego i zostanie wypełniony danymi z DTO lub DTO. W przypadku, gdy chcesz przekazać IEnumerable, model widoku będzie miał IEnumerable w nim –

1

Wystarczy dodać odwołanie do System.Data.Linq do projektu.

Powiązane problemy