OK quindi ho una vista "Dettagli" del cliente fortemente tipizzata che accetta un modello di oggetto Cliente.ASP.NET MVC/LINQ: Qual è il modo corretto di ripetere un Linq.EntitySet in una vista?
Sto utilizzando LINQ su SQL e ogni cliente può disporre di più spazi (parcheggio).
Questa è una relazione FK nel database, quindi il modello Cliente generato da LINQ ha una raccolta "Spaces". Grande!
Ecco un frammento di codice dal mio CustomerRepository dove ho scorrere posti auto del Cliente per eliminare tutti i pagamenti, gli spazi e poi finalmente il cliente:
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);
}
tutto funziona come previsto!
Ora nella mia vista "Dettagli" Voglio popolare una tabella con gli spazi del Cliente:
<% foreach (var s in Model.Spaces)
{ %>
<tr>
<td><%: s.ID %></td>
<td><%: s.InstallDate %></td>
<td><%: s.SpaceType %></td>
<td><%: s.Meter %></td>
</tr>
<% } %>
ottengo il seguente errore:
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'
Infine, se aggiungo questo po 'di codice per la mia classe parziale cliente e utilizzare il foreach nella vista per iterare attraverso ParkingSpaces tutto funziona come previsto:
public IEnumerable<Space> ParkingSpaces
{
get
{
return Spaces.AsEnumerable();
}
}
Il problema qui è che non voglio ripetermi. Stavo anche pensando che avrei potuto usare un ViewModel per passare una collezione di Spaces alla View, tuttavia LINQ già deduce e crea la proprietà Spaces sul modello del Cliente, quindi penso che sarebbe più pulito usarlo.
Mi manca qualcosa di semplice o mi sto avvicinando in modo errato?
Grazie!
La tua vista è fortemente digitata in 'IEnumerable'? Se non lo è, probabilmente è questo il motivo per cui non puoi enumerarlo, senza quel bit di codice helper. –
La mia vista è fortemente digitata in Inherits = "System.Web.Mvc.ViewPage" Forse non ero abbastanza chiaro, ma la vista fornisce i dettagli dell'account di un cliente. Il cliente ha un numero qualsiasi di spazi che dovrebbero essere visualizzati in questa pagina. Quindi non voglio solo un elenco di spazi, voglio una vista dettagliata di un account cliente compresi gli spazi del cliente. –