Нужен ли ViewModel для передачи данных «1 ко многим»? - PullRequest
1 голос
/ 23 февраля 2011

Это, вероятно, основные вещи, но я нигде не могу найти четкий ответ ..

Допустим, я делаю приложение MVC (3) с Entity Framework (EF4), и у меня есть этитри класса:

public class Foo
{
    public int FooID
    public Bar Bar
    public ICollection<Baz> Bazes
}

public class Bar
{
    public int BarID
    public string BarText
}

public class Baz
{
    public int BazID
    public Foo Foo
}

Каков наилучший способ получения всех ПУ с базой соответствующего Бара, чтобы я мог просматривать ПУ и использовать связанные предметы?Нужно ли создавать ViewModel и что он должен содержать?

Что я хочу закончить, это что-то вроде

@model = IEnumerable<Foo/FooViewModel>

foreach(var foo in model)
{
  @if(foo.Bar.BarID == 1)
  {
    foreach(var baz in foo)
    {
      @baz.BazID
    }
  }
}

1 Ответ

2 голосов
/ 23 февраля 2011

Вам специально не нужны модели просмотра. Вы можете передать свои объекты EF непосредственно вашему представлению, и в простых случаях CRUD это нормально. По моему опыту, это никогда не просто ПРОСТО CRUD.

Мне обычно нужно получать данные из многих мест, которые не все содержатся в одном объекте. Например, я могу захотеть показать / скрыть данные в зависимости от роли человека в системе. Фу, вероятно, не знал бы этого. Другим примером будет форма с выпадающим списком. Вам нужно передать эту информацию куда-нибудь. Опять же, foo, вероятно, не знает, какие варианты должны быть.

Я бы создал модель представления для каждого класса, а затем использовал AutoMapper для сопоставления модели домена с вашей моделью представления.

Ваша модель вида будет выглядеть так:

public class FooView{
    public BarView Bar { get; set;}
    public ICollection<BazView> Bazes { get; set;}
}

public class BarView{
    public int BarID { get; set; }
    public BazView Baz { get; set; }
}

public class BazView {
    public int BazID { get; set; }
}

Ваш метод действия будет иметь что-то вроде этого:

var foos = fooRepository.GetFoos();
var model = Mapper.Map<IEnumerable<Foo>,IEnumerable<FooView>>(myFoos);
return View(model);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...