Синтаксис ASP.NET MVC @helper и методы расширения Html Helper

Мне нужно создать собственный вспомогательный метод html. Насколько я знаю есть два пути:

  1. Используйте синтаксис бритвы @helper. http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

  2. Создайте метод расширения HtmlHelper.

Какое решение лучше и почему? Каковы преимущества и недостатки?

Я только читал, что в MVC 3, когда @helper создается глобально в отдельном файле .cshtml, невозможно использовать другие встроенные помощники html. Не знаю, может быть, в MVC 4 это возможно.

Пожалуйста помоги.


person Piotr Czarnecki    schedule 23.07.2013    source источник
comment
возможный дубликат ASP.NET MVC: Razor @helper и методы расширения для HtmlHelper — что предпочтительнее?   -  person James    schedule 23.07.2013


Ответы (3)


Какое решение лучше и почему?

По-разному.

Каковы преимущества и недостатки?

  • Pros of custom HtmlHelper extension:
    • It will work no matter what view engine you are using
    • Это модульное тестирование
    • Он переносим между приложениями
  • Cons of custom HtmlHelper extension:
    • Could become cumbersome to write lots of HTML logic in C#
  • Pros of @helper:
    • Haven't seen any, I never use it
  • Cons of @helper:
    • Haven't seen any, I never use it

Собственно все дело в том, что @helper ИМХО совершенно бесполезен. Если вам нужны преимущества, которые я упомянул о пользовательском расширении HtmlHelper, вы должны создать собственное расширение HtmlHelper.

И если вы столкнулись с некоторыми недостатками пользовательского расширения HtmlHelper, которые я упомянул, вам следует использовать частичное представление.

Я только читал, что в MVC 3, когда @helper создается глобально в отдельном файле .cshtml, невозможно использовать другие встроенные помощники html.

Это неверно. Вы могли бы прекрасно использовать другие помощники Html. Вам просто нужно передать их как параметры:

@helper FooBar(HtmlHelper html) {
    feel free to use the html helper here
}

и при потреблении из представления:

@HelperName.FooBar(Html)
person Darin Dimitrov    schedule 23.07.2013
comment
Дополнительный вопрос. Можем ли мы вызывать существующие вспомогательные функции HTML из пользовательского метода расширения вспомогательной функции HTML? Например, если я создаю собственный помощник HTML под названием «CustomFieldDateTime», могу ли я отображать внутри него Html.ValidationMessage(control4)? Или я должен использовать синтаксис @helper или частичное представление? - person Michael R; 08.03.2014
comment
Да, вы можете вызывать существующие помощники HTML внутри пользовательского помощника. Вы можете сделать это, поместив метод расширения в область действия (using System.Web.Mvc.Html), а затем вызвав требуемый метод. - person Darin Dimitrov; 08.03.2014
comment
Спасибо Дарин. У меня был успех с вашим решением. Я использовал следующий фрагмент кода внутри своего метода расширения HtmlHelper: 'IHtmlString validationMsg = helper.ValidationMessage(controlName);' Где helper — это «помощник HtmlHelper». - person Michael R; 10.03.2014
comment
Я бы не сказал, что это совсем бесполезно. Когда у вас есть сложное представление с большим количеством кода, смешанного с HTML, хорошо иметь @helper, чтобы упростить отслеживание кода. - person iheartcsharp; 19.05.2014
comment
Используя @helper, как мы можем передать лямбду в качестве параметра (i.e. model => model.Name) - person Jack; 07.03.2016

Одним из преимуществ @helper является то, что, поскольку код находится в представлении, вы можете вносить в него изменения без перекомпиляции кода. Это позволяет быстро и легко настраивать помощника во время разработки. Лично я предпочитаю, чтобы разметка оставалась внутри представлений, если это возможно, именно по этой причине.

Связанное с этим преимущество @helper заключается в том, что ваш HTML выиграет от intellisense, в то время как написание HTML в коде C # не получит такого преимущества.

Кроме того, если вы пишете хелпер, который не предназначен для повторного использования за пределами одного представления, то @helper упрощает его прояснение. Метод расширения HtmlHelper будет сбивать с толку, если только одно представление предназначено для его использования (если только вам не удастся поместить его в класс и в пространство имен, где только это одно представление когда-либо увидит метод расширения).

person Bochu    schedule 06.01.2015

Они могут быть похожими на пользовательские элементы управления и пользовательские элементы управления.

Используйте @helper для форматирования стиля бритвы в представлениях. Используйте методы расширения для универсальных решений, например, перегружая создание этикетки, которое принимает дополнительные параметры.

Вы можете найти подробное объяснение с примерами здесь

person Moin    schedule 23.07.2013