6

Мне нужно создать собственный метод html helper. Насколько мне известно, существует два способа:ASP.NET MVC @helper синтаксис vs 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 это возможно.

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

+0

Возможный дубликат [ASP.NET MVC: Razor @helper vs методы расширения для HtmlHelper - что предпочтительнее?] (Http://stackoverflow.com/questions/6285825/asp-net-mvc-razor-helper-vs -extension-methods-to-htmlhelper-which-is-preferr) – James

ответ

3

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

Это зависит.

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

  • Плюсов расширения пользовательского HtmlHelper:
    • Это не будет работать независимо от того, какого вида двигателя вы используете
    • Этого устройство проверяемого
    • Это портативное между приложениями
  • Недостатки пользовательского расширения HtmlHelper:
    • Может стать громоздкими, чтобы написать много логики HTML в C#
  • Плюсы @helper:
    • не видели, я никогда не использовать его
  • Против @helper:
    • Не видели, я никогда не использую его, я его никогда не использую

На самом деле дело в том, что @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) 
+0

** Последующий вопрос **: Можно ли назвать существующие помощники HTML из пользовательского метода расширения HTML-помощника? Например, если я создаю настраиваемый HTML-помощник под названием «CustomFieldDateTime», могу ли я отобразить Html.ValidationMessage («control4») внутри? Или я должен использовать синтаксис или частичный просмотр @helper? –

+1

Да, вы можете вызывать существующие HTML-помощники внутри настраиваемого помощника. Вы можете это сделать, добавив метод расширения в область видимости ('using System.Web.Mvc.Html'), а затем вызывая требуемый метод. –

+0

Спасибо Дарин. У меня был успех с вашим решением. Я использовал следующий фрагмент кода внутри моего метода расширения HtmlHelper: 'IHtmlString validationMsg = helper.ValidationMessage (controlName);' Где помощник - это помощник HtmlHelper. –

3

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

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

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

7

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

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

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