2010-02-08 3 views
5

Мне просто интересно, где люди создают свой SelectList - в действии или в представлении.ASP.net MVC: Создание SelectList в представлении или действии?

Я видел примеры того и другого, который имеет для меня наибольшее значение, делает это в действии и имеет модель вида, имеющую свойство типа SelectList.

С другой стороны, я видел примеры, когда люди имеют модель представления, имеют свойство SelectList, а SelectList заполняется в модели представления (либо в конструкторе, либо через ленивую загрузку). Мне нравится эта идея, так как это означает, что в моих действиях меньше кода ...

Короче говоря, мне просто интересно, что делают люди.

Приветствия Энтони

ответ

5

Создать свой SelectList в контроллере (по глядя вверх список элементов из вашей модели хранилища), и передать его в представлении или как объект ViewData, или как часть вашего сильно типизированных ViewModel.

+0

Почему? Я был бы рад поддержать вас, если вы предоставите более подробную информацию о том, почему вы считаете, что этот подход предпочтительнее. Легче ли тестировать? Содействовать повторному использованию кода? Лучшее разделение проблем? –

+0

@Seth: Цель сильно типизированного объекта ViewModel состоит в том, чтобы упаковать все данные, необходимые для представления, чтобы правильно отображать их. В этом случае, поскольку для выпадающего списка требуется список элементов, целесообразно включить его в объект ViewModel. Программист, следующий за мной, увидит SelectList в ViewModel и сделает вывод, что он используется для заполнения раскрывающегося списка в представлении. И ему не нужно нигде искать. –

+0

@ Robert: Я полностью согласен с вами.Я хотел сказать, что ваш ответ был выбран как «правильный», и я подумал, что некоторая дополнительная информация может быть полезной для тех, кто сталкивается с этим вопросом в будущем. Я бы предпочел, чтобы новые программисты MVC знали _why_ это предпочтительнее, вместо слепо следуя SO-ответу :) –

1

Обычно я создаю свой SelectList на уровне действия или услуги и передаю его в мой просмотр через ViewData. Я также сделал его частью модели представления и строго типизированного представления. Оба способа создают его на уровне действия или сервиса.

+0

Передача списков выбора с помощью ViewData в порядке, но если ваша страница строго типизирована для объекта ViewModel, то чище просто включить ваши списки выбора как часть ViewModel. –

+0

согласился, и это то, что я делаю, если вам нужно отправить больше данных в представление, чем только список выбора. Если мне нужен только список выбора, то я предпочитаю использовать ViewDat а. –

1

У меня есть SelectList, который отображается как свойство в модели представления и заполняет его в действии с помощью необходимого репозитория. Я думаю, что код, который напрямую взаимодействует с репозиториями, должен быть тем, который также отвечает за заполнение, будь то действия контроллера или уровень обслуживания или что-то еще.

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

Вы также можете создать отдельный специальный объект, называемый Инициализатор, или что-то в этом роде, которое выполняет все заселения и инициализации, если у вас есть несколько полей SelectList и вы хотите, чтобы ваши действия были очищены.

+0

«Я не думаю, что заполнение списка непосредственно из модели представления является хорошей идеей, потому что для модели представления потребуется зависимость от репозитория» - необязательно. Модель просмотра заполнена в контроллере (включая список элементов, необходимых для SelectList), поэтому в самой модели просмотра не требуется зависимость от репозитория. –

+0

Это была моя точка зрения. Код заполнения репозитория должен вызываться из контроллера, а не из кода модели представления (конструктор или какой-либо другой метод). – Victor

2

Это особенность, характерная для представления, поэтому я предпочитаю делать это в представлении, используя хелпер Html. Поэтому я передаю коллекцию View и использую метод html helper для сопоставления элементов SelectListItems. Метод может выглядеть примерно так:

public static IList<SelectListItem> MapToSelectItems<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected) 
{ 
    var result = new List<SelectListItem>(); 

    foreach (var item in itemsToMap) 
    { 
     result.Add(new SelectListItem 
     { 
      Value = valueProperty(item), 
      Text = textProperty(item), 
      Selected = isSelected(item) 
     }); 
    } 
    return result; 
} 

С уважением.

+0

Вам все равно нужно создать список элементов в ViewModel, так почему бы просто не сделать его SelectList? –

+0

Вы правы, я думал о модели так же, как сущность или dto, переведенные из сущности (не как модель с учетом вида или ViewModel), так или иначе, вы могли бы использовать метод выше для перевода. – uvita

+0

Я думаю, что модели, зависящие от просмотра, должны, вероятно, напрямую открывать SelectList, потому что это уменьшает количество кода, который вы должны написать в представлении, даже если немного. Но в некоторых случаях я передаю объект DTO или бизнес-объект в представление, и в тех случаях я буду называть помощником, как вы показываете выше [мой вызван .ToSelectList()] из представления. Я думаю, что оба подхода подходят в разных сценариях. –

Смежные вопросы