После ознакомления с учебником Steve Sandersons pro asp.net Framework мне удалось получить базовые функции редактирования и отображения для двух объектов базы данных с использованием шаблона репозитория.
У меня проблемы, когда я хочу отобразить / обновить свойства из нескольких объектов.
Мне известно, что viewmodels - это способ сделать это, но я не совсем понимаю, когда мне следует использовать viewmodel и как они вписываются в мои объекты модели предметной области.
Например, для моих двух объектов у меня есть репозиторий и следующие методы для возврата каждого списка объектов
public IQueryable<Customer> Customers
{
get { return customersTable; }
}
public IQueryable<CustomerSite> CustomerSites
{
get { return customerSitesTable; }
}
Затем в моем контроллере я передаю объекты из репозитория в представление как
public ViewResult List([DefaultValue(1)] int page)
{
var customerSitesToShow = customerSiteRepository.CustomerSites;
var customersToShow = customerRepository.Customers;
var viewModel = new CustomerSitesListViewModel
{
CustomerSites = customerSitesToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
customers = customersToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
PagingInfo = new PagingInfo
{
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = customerSitesToShow.Count()
}
};
return View(viewModel); //Passed to view as ViewData.Model (or simply model)
}
}
Теперь я понимаю, что могу использовать модель представления для доступа к свойствам двух объектов в одном представлении, поэтому у меня есть одна модель представления со свойствами для моих двух объектов
{
public class SiteViewModel
{
public int Id { get; set; }
public int CustomerId { get; set; }
public string AddressLine1 { get; set; }
}
public class CustomerViewModel
{
public int Id { get; set; }
public string CustomerName { get; set; }
public string PrimaryContactName { get; set; }
public SiteViewModel Site { get; set; }
}
}
Затем мастер-представлениемодель, которую я строго ввожу в шаблон отображения
public class CustomerSitesListViewModel
{
public IList<CustomerSite> CustomerSites { get; set; }
public PagingInfo PagingInfo { get; set; }
public IList<Customer> customers { get; set; }
public CustomerViewModel Customers { get; set; }
}
Когда я запускаю это, шаблон отображения отображается, но моя коллекция клиентов пуста, так как я думаю, что мне нужен оператор соединения LINQ для получения списка клиентов исайты клиентов?Является ли LINQ join лучшим способом сделать это?так что я могу получить доступ к обоим объектам из шаблона отображения, например
<%= Html.DisplayFor(x => x.Customers.CustomerName) %>
<%= Html.DisplayFor(x => x.Customers.Site.AddressLine1) %>
. Здесь я запутываюсь, когда должен идти метод, содержащий запрос LINQ, чтобы вернуть коллекцию клиентов, если это должно быть в хранилищеили вид модели?