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 2

1 ответ:

Вы правильно понимаете модели представлений. Они предназначены для того, чтобы лишить слой представления какой-либо связи со слоем данных.

Вы можете/должны разбить код доступа к данным на вспомогательные классы и методы, чтобы удалить сложность из ваших контроллеров. Эти методы будут запрашивать слой данных и возвращать модель представления.

Я не использовал automapper, но это звучит как нечто, что определенно может помочь здесь.