Передача IEnumerable <Object>в ViewModel - должен ли объект быть ViewModel? - PullRequest
2 голосов
/ 22 февраля 2012

Сегодня я ознакомился с MVC и наткнулся на лучшую практику не передавать модель непосредственно в представление.Вместо этого используйте ViewModel.

Я исследовал AutoMapper и планирую использовать его для сопоставления моих ViewModels с соответствующими моделями.И я понимаю, что AutoMapper достаточно умен, чтобы отображать IEnumerable в IEnumerable без отдельного сопоставления, если сопоставлены source и dest.

Но я немного озадачен тем, как обрабатывать передачу IEnumerable в моей модели представленияна мой взгляд.В настоящее время моя страница работает с использованием ViewModel, включающей IEnumerable, но я прочитал, что это так же плохо, как и передача IEnumerable непосредственно в представление.Так мне нужен отдельный ViewModel для хранения объекта, который будет использоваться в свойстве IEnumerable основной ViewModel?

Так, где Activity - это рассматриваемая модель:

public class ActivityHistoryViewModel
{
    public IEnumerable<Activity> activities { get; set; }
}

делатьнужно создать ActivityViewModel и написать мою ActivityHistoryViewModel, как это?

public class ActivityHistoryViewModel
{
    public IEnumerable<ActivityViewModel> activities { get; set; }
}

Есть ли более простой способ сделать это?

1 Ответ

1 голос
/ 22 февраля 2012

Да, это правильно. Если предположить, что единственная информация, которая понадобится вашей модели, это список, то вам не нужно ActivityHistoryViewModel, и представление можно набрать так:

@model IEnumerable<ActivityViewModel>

ваша конфигурация автоматического сопоставления будет выглядеть так:

Mapper.CreateMap<Activity, ActivityViewModel>();

вы бы отобразили карту так:

IEnumerable<Activity> data = GetActivities();
var model = Mapper.Map<IEnumerable<Activity>, IEnumerable<ActivityViewModel>>(data);
return View(model);

И когда вы определяете ActivityViewModel, вы можете либо создать дубликат типа свойство-свойство-свойство, либо обрезать лишние данные, которые вам не нужны (в моем случае это будет что-то вроде «дата создания», то есть генерируется дб и не имеет значения для пользователей).

Или , если вы хотите придерживаться ActivityHistoryViewModel, чтобы передать больше, чем просто список:

тип просмотра:

@model ActivityHistoryViewModel

Конфигурация отображения может остаться прежней

карта вроде этого:

IEnumerable<Activity> data = GetActivities();
var model = new ActivityHistoryViewModel() {
    someOtherProperty = "hello world!",
    activities = Mapper.Map<IEnumerable<Activity>, IEnumerable<ActivityViewModel>>(data)
};
return View(model);
...