2013-06-07 3 views
0

Есть модель поставщика и модель пользователя в моем проекте, каждый поставщик имеет несколько пользователей
поставщика моделиИсключение NullReferenceException в контроллере (asp.net MVC)

public class SupplierRow 
{ 
    public Guid Id { get; set; } 
    public string FullName { get; set; } 
    public bool Subscribed { get; set; } 
    public bool Active { get; set; } 
    public int Visits { get; set; } 

    public List<UserRow> Users { get; set; } 

    public bool AllInactive 
    { 
     get 
     { 
      foreach (UserRow ur in Users) 
      { 
       if (ur.Status == 1) return false; 
      } 
      return true; 
     } 
    } 
} 

и модель пользователя

public class UserRow 
{ 
    public Guid Id { get; set; } 
    public string FullName { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public int Status { get; set; } 
    public int Role { get; set; } 

    public Guid SupplierId { get; set; } 
} 

, то я использую свои модели в контроллере

public ActionResult Grid(bool? active) 
    { 
     var suppliers = Context.Suppliers.AsNoTracking() 
      .WhereIf(active != null, e => e.Active == active) 
      .Select(e => new SupplierRow 
          { 
           Id = e.Id, 
           FullName = e.FullName, 
           Active = e.Active, 
           Visits = e.Visits, 
          }) 
          .ToList(); 


     List<Guid> supplierIds = new List<Guid>(); 
     foreach (SupplierRow sr in suppliers) 
     { 
      supplierIds.Add(sr.Id); 
     } 

     var users = Context.Users.AsNoTracking() 
      .Where(e => supplierIds.Contains(e.SupplierId.Value)) 
      .Select(e => new UserRow 
      { 
       Id = e.Id, 
       FullName = e.FullName, 
       Email = e.Email, 
       Name = e.Name, 
       Status = e.Status, 
       Role = e.Role, 
       SupplierId = e.SupplierId.Value 
      }).ToList(); 


     foreach (UserRow ur in users) 
     { 
      foreach (SupplierRow sr in suppliers) 
      { 
       if (ur.SupplierId == sr.Id) 
       { 
        sr.Users.Add(ur); 
       } 
      } 
     } 

     return PartialView("_Grid", suppliers); 
    } 

, но когда я пытаюсь отладить мой проект, я получаю какое-то исключение здесь enter image description here Что случилось? Как я могу это исправить?

+1

'sr.Users' является' null'. Вы можете добавить 'Users = новый список ()' в свой конструктор 'SupplierRow' – Ramunas

ответ

2

Ваш список Users не инициализирован. Создать новый список перед доступом к ней Users = new List<UserRow>(); Вы можете изменить SupplierRow класс:

public class SupplierRow { 
    private List<UserRow> users = new List<UserRow>(); 

    public List<UserRow> Users 
    { 
     get { return users; } 
     set { users = value; } 
    } 
    ... 
} 

или в конструкторе:

public class SupplierRow 
{ 
    public SupplierRow() 
    { 
     Users = new List<UserRow>(); 
    } 
    public List<UserRow> Users { get; set; } 
    ... 
} 

или до доступа к нему:

foreach (UserRow ur in users) 
{ 
    foreach (SupplierRow sr in suppliers) 
    { 
     sr.Users = new List<UserRow>(); 
     if (ur.SupplierId == sr.Id) 
     { 
      sr.Users.Add(ur); 
     } 
    } 
} 

или вы можете просто использование linq:

foreach (SupplierRow sr in suppliers) 
{ 
    sr.Users = users.Where(user => user.SupplierId == sr.Id); 
} 

return PartialView("_Grid", suppliers); 
+0

Можете ли вы объяснить мне, где я должен добавить этот код? – Heidel

+0

@Heidel, см. Мое редактирование. – Zabavsky

+0

@ Забавский Спасибо большое! – Heidel

Смежные вопросы