ASP.NET MVC / LINQ: как правильно перебирать Linq.EntitySet в представлении? - PullRequest
5 голосов
/ 26 апреля 2010

ОК, поэтому у меня строго типизированное представление "Сведения" о клиенте, которое принимает объектную модель клиента.

Я использую LINQ to SQL, и у каждого Клиента может быть несколько мест для парковки.

Это отношение FK в базе данных, поэтому у моей модели клиента, сгенерированной LINQ, есть коллекция "Spaces". Отлично!

Вот фрагмент кода из моего CustomerRepository, в котором я перебираю парковочные места Клиента, чтобы удалить все платежи, пробелы, а затем, наконец, клиент:

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

Все работает как положено!

Теперь в моем представлении «Детали» я хочу заполнить таблицу местами клиента:

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

Я получаю следующую ошибку:

оператор foreach не может работать с переменными типа «System.Data.Linq.EntitySet», поскольку «System.Data.Linq.EntitySet» не содержит общедоступного определения для «GetEnumerator»

Наконец, если я добавлю этот бит кода в свой частичный класс Customer и использую foreach в представлении для итерации по ParkingSpaces, все будет работать как положено:

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

Проблема в том, что я не хочу повторяться. Я также подумал, что мог бы использовать ViewModel для передачи коллекции Spaces в View, однако LINQ уже выводит и создает свойство Spaces в модели Customer, поэтому я думаю, что было бы наиболее разумно просто использовать это.

Мне не хватает чего-то простого или я подхожу к этому неправильно?

Спасибо!

Ответы [ 4 ]

14 голосов
/ 20 мая 2010

Извините, если я немного опоздал, отвечая на этот вопрос, но правильный метод решения вашей проблемы - добавить ссылку на сборку в ваш файл web.config, чтобы представление могло получить доступ к методу GetEnumerator (). Вы можете сделать это, используя справочную строку сборки, указанную в сообщении об ошибке компоновки страницы. например,

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

1 голос
/ 29 сентября 2010

Просто добавьте ссылку на System.Data.Linq в ваш проект.

1 голос
/ 26 апреля 2010
  • Прежде всего, используя View Models вместо прямого доступа к DTO Предпочтительнее. (для этого используйте Automapper )

  • Во-вторых, строго введите ваши взгляды на View Model и View Model имеют IEnumerable или List передается в просмотреть, затем вы можете перебрать его

1 голос
/ 26 апреля 2010

Есть два способа сделать это, кроме вашего маленького вспомогательного метода.

Вы можете наследовать IEnumerable вашего класса на странице:

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

<% foreach (var item in Model)
   {

Или вы можете привести ваш объект сущности к IEnumerable:

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