MVC 3 Code First ViewModel-как это сделать?
В настоящее время я играю с ASP .NET MVC 3 и - для доступа к данным-Code first подходом Entity Framework.
Я прочитал много документации, блогов, вопросов stackoverflow и т. д. но я не нашел точного ответа на следующий вопрос, и я надеюсь, что кто-то там может мне помочь.У меня есть простая модель (база данных), содержащая два объекта: проект и заказчик
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Customer Customer { get; set; }
}
И...
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public int Rate { get; set; }
}
Для отображения, например, списка клиенты я создал простой ViewModel:
public class ProjectListModel
{
public List<Project> Projects { get; set; }
}
Код в моем контроллере:
public ActionResult ProjectList()
{
var model = new ProjectListModel()
{
Projects = db.Projects.OrderBy(x => x.Customer.Id).ToList<Project>()
};
return PartialView("_ProjectList", model);
}
Таким образом, я могу отобразить список проектов и даже соответствующее имя клиента.
@Html.DisplayFor(modelItem => item.Name), @Html.DisplayFor(modelItem => item.Customer.Name))
И тут начинается мой вопрос ; -)
Я не уверен, правильно ли я понял концепцию ViewModels, поскольку возвращаю список моих "объектов базы данных". Как бы вы это сделали? Я мог бы представить себе новый класс:
public class SingleProjectForViewModel
{
public string ProjectName {get;set;}
public string CustomerName { get;set;}
}
И изменить мою ViewModel на:
public class ProjectListModel
{
public List<SingleProjectForViewModel> {get;set;}
}
...зато код в моем контроллере стал бы очень длинным только для заполнения ViewModel (fetch from DB, create instance of SingleProjectForViewModel и add this instance to an instantated List) - для этого примера это было бы нормально, но с большими классами данных и более сложными представлениями...!?
Я также читал об Auto-Mapper, но я не уверен, правильно ли использовать этот инструмент для такого рода "проблем".
Большое Спасибо, что прочитали это-и еще больше за ответ или любой совет! :- )
1 ответ:
Вы правильно понимаете модели представлений. Они предназначены для того, чтобы лишить слой представления какой-либо связи со слоем данных.
Вы можете/должны разбить код доступа к данным на вспомогательные классы и методы, чтобы удалить сложность из ваших контроллеров. Эти методы будут запрашивать слой данных и возвращать модель представления.
Я не использовал automapper, но это звучит как нечто, что определенно может помочь здесь.