Использовать объектный метод в asp.net Представление MVC

#asp.net-mvc #view #extension-methods

#asp.net-mvc #Вид #расширение-методы

Вопрос:

Месяц или два назад, когда я начал делать asp.net Работа с MVC Я помню, что читал, что не рекомендуется вызывать объектные методы, подобные следующим, в представлении:

 <%: Html.ListBoxFor( m => Model.SelectedId, Model.SelectItems.ToSelectList() ) %>
  

Это выше — всего лишь пример, а не прямая строка кода, которую я использую. Я использую методы расширения, чтобы превратить мои перечислимые объекты в готовые к привязке к списку коллекции IEnumerable. Я знаю, что кто-то высказывал обеспокоенность в статье об этом, но я не могу вспомнить, что это было. На самом деле я не кодирую его, это было на данный момент, но то, как я это делаю, становится бременем. Я пишу методы расширения для преобразования всех моих объектов IEnumerable как в коллекции SelectListItem, так и в объект MultiSelectList. Итак, мои модели представления становятся раздутыми из-за «потенциальных» способов отображения данных. Вместо того, чтобы они были просто перечислимыми доступными параметрами, я отслеживаю 4 новых фрагмента данных: коллекция SelectListItem, объект SelectListValue, элемент управления MultiSelectList, коллекция MultiSelectListValues.

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

Заранее спасибо!

Ответ №1:

Идея, о которой вы говорите, основана на принципе, что представление в MVC должно быть как можно более простым. Поскольку его сложнее всего протестировать, следует избегать ненужного раздувания. Строка вашего примера может быть соединена несколькими различными способами. Вы могли бы попробовать написать расширение, которое берет перечисление из вашей модели и преобразует его в список выбора, который может быть отправлен в listbox, или вы можете изменить свойство модели, чтобы возвращать перечисление элементов списка. Последний — мой предпочтительный метод. Модель существует для организации данных, которые будут использоваться представлением, поэтому нет причин выводить данные, которые не могут быть использованы представлением напрямую. Любой из этих методов исключил бы сложность представления и поместил бы его куда-нибудь, что проще для модульного тестирования. Надеюсь, это поможет.

Комментарии:

1. У меня было ощущение, что это просто «философская» причина, но я не мог вспомнить. В настоящее время я обрабатываю все это в контроллере и создаю новые записи в модели для каждого метода, который может потребоваться. У меня есть метод расширения для преобразования перечисляемого, и я вызываю его при заполнении модели перед отправкой ее куда-либо. Поскольку казалось проще просто вызвать расширение в представлении, я хотел вспомнить, почему мой мозг продолжал кричать мне не делать этого. Спасибо за напоминание! Слишком много, слишком быстро … иногда бывает сложно сохранить все это прямым, ха-ха.