Когда я должен использовать методы расширения HtmlHelper? - PullRequest
3 голосов
/ 13 ноября 2009

Я все чаще нахожу ситуации, когда моему представлению ASP.NET MVC требуется некоторая логика для выполнения макета. Этим процедурам нет места ни в моей модели, ни в моем контроллере. У меня есть 3 варианта:

  1. Пишите много встроенных в представление <%%>.
  2. Пишите меньше <%%> в ряде частичных просмотров.
  3. Напишите метод расширения HtmlHelper.

Это последний вариант, который меня смущает. Можно ли это сделать, если логика специфична только для этого одного представления? Расширение будет «видимым» для объекта Html любого другого представления, и оно никогда не понадобится.

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 13 ноября 2009

Я лично предпочитаю вариант 3 («Написать метод расширения HtmlHelper»), потому что эти части кода легко поддаются тестированию на модуле.

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

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

1 голос
/ 13 ноября 2009

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

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

0 голосов
/ 13 ноября 2009

Можно ли это сделать, если логика специфичен только для одного этого вида?

Да. Читайте дальше ...

The расширение будет «видимым» для HTML-объект любого другого представления, и это никогда не понадобится.

Нет правда. Это зависит от того, как вы зарегистрируете метод расширения для представления. Это только в том случае, если вы добавляете пространство имен в раздел web.config namespaces .

Если вы хотите использовать метод расширения в одном представлении, просто импортируйте его пространство имен в одно представление:

<%@ Import Namespace="NamespaceOf.Your.ExtensionMethods.ForThisViewOnly"%>
...