MVC Entity Framework с использованием вложенного foreach в представлении - PullRequest
2 голосов
/ 11 января 2010

Я передаю 3 набора данных в представление в модели представления, и у меня возникает проблема, связывающая один из них с двумя другими в моем коде foreach:

Мои таблицы БД: «ServiceGroups» является родителем «Services» «Службы» связаны через объединяющую таблицу (с использованием 2 составных первичных ключей) с таблицей aspnet_users (я называю «пользователи»)

Я включил это в модель EF под названием GWServices.edmx

так что теперь у меня есть 3 сущности, связанные так: ServiceGroup (родитель для) службы Сервис (много ко многим с) Пользователь

Затем я создал контроллер и видовую модель, подобную этой:

{

    public class ServicesViewModel
    {
        public ServicesViewModel(List<ServiceGroup> servicegroups, List<Service> services, List<User> aspnetusers)
        {
            this.ServiceGroups = servicegroups;
            this.Service = services;
            this.AspnetUsers = aspnetusers;

        }

        public List<ServiceGroup> ServiceGroups { get; set; }
        public List<Service> Service { get; set; }
        public List<User> AspnetUsers { get; set; }

    }


    public class ClientServicesController : Controller
    {

        public ActionResult Index()
        {
            GWEntities _db = new GWEntities();

            var servicegroups = _db.ServiceGroupSet.ToList();
            var services = _db.ServiceSet.ToList();
            var aspnetusers = _db.UserSet.ToList();

            return View(new ServicesViewModel(servicegroups, services, aspnetusers));
        }

    }
}

Затем я создал представление с 3 циклами foreach, чтобы:

  1. Получить и представить в виде UL список всех сервисных групп в базе данных (который работал)
  2. Заполните таблицу в каждой группе услуг, заполнив некоторые данные службы для каждой службы в данной группе (которые также работают)
  3. Проверьте, связан ли пользователь с этой конкретной службой, если это так, покажите только значок красного креста, в противном случае покажите зеленый значок «выберите меня». (это не заполняет пользователей)

Код выглядит так:

<% foreach (var servgroup in Model.ServiceGroups) { %> 
<ul> <%= servgroup.ServiceGroupName%> </ul>
<table>
     <% foreach (var serv in servgroup.Service)
        { %>
     <tr>
     <td class="td1">
     <%= serv.ServiceDescription%>
     </td>
     <td class="td2">
     <% = Html.Encode(String.Format("{0:f}",serv.MonthlyPrice)) %> 
        </td>
        <td class="td3"> 
           <%foreach (var user in serv.User) {%>
              <%if (user.UserName == User.Identity.Name)
                { %>
            <img src="/Content/LightRedCross_2.png" alt="" height="15px" width="15px"/>
                    <% }
                else
                {%>
            <img src="/Content/LightGreenAdd_2.png" alt="" height="15px" width="15px"/>           
              <%} %>
           <%} %>
        </td>
        </tr>
   <% } %> 
    </table> 
<% } %>

Может кто-нибудь сказать мне, почему foreach (var user в serv.user) не распознает, что «Customer1» (пользователь, вошедший в систему) заказал 6 услуг (как это указано в таблице присоединения)?

Спасибо!

Пол

Ответы [ 2 ]

1 голос
/ 11 января 2010

Глядя на ваш код, я думаю, что это можно решить, загрузив дочерние таблицы ServiceGroups.

Вероятно, что ссылка на Службы и пользователей не была загружена в исходном запросе Entity Framework. Поэтому, когда вы пытаетесь перебрать дочерние элементы в цикле foreach, он не видит коллекцию, он просто видит ноль.

Вы должны попробовать изменить свои операторы поиска:

_db.ServiceGroupSet.ToList()

до

_db.ServiceGroupSet.Include("ServiceSet").Include("UserSet").ToList()

Если это не решит вашу проблему, я бы поставил точку останова в приведенной ниже строке кода и обошел список, чтобы увидеть, есть ли в нем ожидаемые вами данные.

this.ServiceGroups = servicegroups; 
0 голосов
/ 11 января 2010

Для начала сравнения имен пользователей обычно не чувствительны к регистру. Итак, это:

          <%if (user.UserName == User.Identity.Name)

... должно быть:

          <%if (user.UserName.Equals(User.Identity.Name, StringComparison.OrdinalIgnoreCase))

У вас также есть ошибка, из-за которой вы не располагаете контекстом вашей сущности. Вы должны переопределить Controller.Dispose и утилизировать его там. Это позволяет представлению визуализироваться до удаления контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...